質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

1735閲覧

Python Tkinterボタンからの外部アプリKillの方法教えてください。

shootinghead

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2021/10/26 09:21

前提・実現したいこと

Raspberry pi,pythonともに初心者です。
GUIのボタンまたは、GPIOからの物理スイッチで
PDFアプリのevinceを起動と終了をしたいと思いっております。
evinceは立ち上がるんですが、終了でKillしたいのですが
方法がわかりません。
どなたか、ご指導お願い致します。

該当のソースコード

# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import sys,os,time import subprocess import tkinter as tk def STR_procss (event): path = ("evince") evince_GO = subprocess.Popen(path) def END_procss(event): print("end") evince_GO.kill() GPIO.setmode(GPIO.BCM) GPIO16 = 16 GPIO21 = 21 GPIO.setup(GPIO16, GPIO.IN, pull_up_down = GPIO.PUD_UP)#プルアップ抵抗 有効 GPIO.setup(GPIO21, GPIO.IN, pull_up_down = GPIO.PUD_UP)#プルアップ抵抗 有効 GPIO.add_event_detect(GPIO16, GPIO.RISING, callback=STR_procss, bouncetime=200) GPIO.add_event_detect(GPIO21, GPIO.RISING, callback=END_procss, bouncetime=200) #Tkinter root = tk.Tk() root.title("TEST Launcher") root.geometry("300x120+10+10") #ボタンを作る button1 = tk.Button(root, text="evince起動", bg="YELLOW",bd=5,font=("","14"),command= lambda : STR_procss(button1)) button1.pack(side="top") button2 = tk.Button(root, text="evince終了", bg="RED",bd=5,font=("","14"),command= lambda : END_procss(button2)) button2.pack(side="bottom") root.mainloop() try: while True: time.sleep(1) except KeyboardInterrupt:#Ctrl+Cで終了 GPIO.remove_event_detect() GPIO.cleanup()

補足情報(FW/ツールのバージョンなど)

Rsapberry Pi4
Python3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージは出てませんか?

コードを見て目に付いた部分ですが、
evince_GO はローカル変数なので、別の関数からは参照出来ません。
NameError: name 'evince_GO' is not defined と出る場合は、
STR_procss 関数内で global 宣言で対応できます。

他のエラーの場合は、質問文にエラーメッセージを記載してください。


グローバル変数の使いかた

python

1 2#1 関数の外で初期化 3evince_GO = None 4 5#2 各関数内でグローバル宣言 6# 変数に対して = で直接「代入」を行う関数でのみ宣言 7# 参照のみの場合は不要です。 8 9def STR_procss (event): 10 global evince_GO 11 12 #3 利用前に Noneである事を確認 13 # 既に evince_GO がある場合、多重起動を防ぎます 14 if not evince_GO: 15 16 # XXX: グローバル変数とは別問題ですが、Popenの引数はリストにします。 17 # 注意点 ("evince") はタプルにはなりません。末尾にカンマが必要です。 18 # https://docs.python.org/ja/3/library/subprocess.html#subprocess.Popen 19 path = ["evince"] 20 21 evince_GO = subprocess.Popen(path) 22 23def END_procss(event): 24 global evince_GO 25 26 #4 利用後に後始末 27 if evince_GO: 28 print("end") 29 evince_GO.kill() 30 evince_GO = None 31

投稿2021/10/26 11:23

編集2021/10/27 02:32
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shootinghead

2021/10/26 23:47

回答有難うございます。 仰る通りエラーが「NameError: name 'evince_GO' is not defined」 小生、知識不足なのでぶしつけながら重ねて質問させてください。 関数の外でglobal宣言してそれをコード化するイメージが湧きません。 参考になるURLや考え方を御指導いただけませんか。
teamikl

2021/10/27 02:21

> 関数の外でglobal宣言して (Pythonでは) global 宣言は関数の中で行います。回答欄に追記 ---- 参考URL 9.2.1. スコープと名前空間の例 > 異なるスコープと名前空間がどのように参照されるか、また global および nonlocal が変数の束縛にどう影響するか、この例で実演します: https://docs.python.org/ja/3/tutorial/classes.html#scopes-and-namespaces-example
shootinghead

2021/10/27 03:04

参考URL有難うございます global宣言の使い方が根本から間違っていました。 非常に参考になりました。 また、参考コードとおり修正したら GUIのボタンでもevinceが起動&終了 GPIOの物理スイッチでもevinceが起動&終了できました。 狙った動きが出来るようになったので次のステップへ進めます。 本当に有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問