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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4943閲覧

Python Tkinter オブジェクト削除方法

renton48

総合スコア17

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/03 05:34

お願いしたいこと

PythonでTkinterのアプリを作っていますが、
プログレスバーの非表示がうまくできません。

以下のエラーメッセージが発生しています。

変数のやり取りがうまくできていないか
ウインドウの更新がうまくできていないのかと思い、
色々試してみましたが、うまくいきません、、。

どなたかお助け願えないでしょうか、、。

宜しくお願い申し上げます。

発生しているエラーメッセージ

UnboundLocalError: local variable 'pbar2' referenced before assignment

該当のソースコード

Python

1from time import sleep 2import tkinter as tk 3import tkinter.ttk as ttk 4 5"""【関数定義】******************************""" 6# プログレスバー 7def progressbar(display): 8 if display : 9 pbar2 = ttk.Progressbar( 10 root, 11 orient="horizontal", 12 length=200, 13 mode='indeterminate') 14 pbar2.configure(maximum=10, value=0) 15 pbar2.grid(row=6, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W+tk.E) 16 # プログレスバースタート 17 pbar2.start() 18 print("start") 19 else: 20 # プログレスバーストップ 21 pbar2.grid_remove() 22 print("stop") 23 24# ボタンアクション 25def pushed(self): 26 progressbar(True) 27 #ここで,valueにEntryの中身が入る 28 urlvalue = self.get() 29 """ここで重い処理をする""" 30 sleep(5) 31 print("complet") 32 """****************""" 33 progressbar(False) 34 35def main(): 36 # メインウィンドウ作成 37 global root 38 root = tk.Tk() 39 # メインウィンドウのタイトルを変更 40 root.title("Price Checker") 41 # メインウィンドウを640x480にする 42 root.geometry("270x280") 43 # メインウインドウのサイズ固定 44 root.resizable(0,0) 45 46 #ラベルを追加 label = tk.Label(window, param1=value, param2=value...) 47 urlLabel = tk.Label(root, text="検索URL") 48 #表示 49 urlLabel.grid(row=0, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W+tk.E) 50 #URL入力欄 51 urlEditBox = tk.Entry() 52 urlEditBox.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W+tk.E) 53 54 #ラベルを追加 label = tk.Label(window, param1=value, param2=value...) 55 lowpriceLabel = tk.Label(root, text="最低価格") 56 #表示 57 lowpriceLabel.grid(row=2, column=0, padx=5, pady=5) 58 #最低価格入力欄 59 lowprice = tk.Entry() 60 lowprice.grid(row=3, column=0, padx=5, pady=5) 61 62 #ラベルを追加 label = tk.Label(window, param1=value, param2=value...) 63 highpriceLabel = tk.Label(root, text="最低価格") 64 #表示 65 highpriceLabel.grid(row=2, column=1, padx=5, pady=5) 66 #最低価格入力欄 67 highprice = tk.Entry() 68 highprice.grid(row=3, column=1, padx=5, pady=5) 69 70 #ボタンを追加 71 submitbutton = tk.Button(root, text=" 実行 ", command= lambda : pushed(urlEditBox)) 72 #表示 73 submitbutton.grid(row=4, column=0, columnspan=2, pady=10) 74 75 # ユーザーフォーム実行 76 root.mainloop() 77 78if __name__ == "__main__": 79 main() 80 81

補足情報

Python3.7です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1def progressbar(display): 2 if display : 3 pbar2 = ttk.Progressbar( 4 root, 5 orient="horizontal", 6 length=200, 7 mode='indeterminate') 8 pbar2.configure(maximum=10, value=0) 9 pbar2.grid(row=6, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W+tk.E) 10 # プログレスバースタート 11 pbar2.start() 12 print("start") 13 else: 14 # プログレスバーストップ 15 pbar2.grid_remove() 16 print("stop")

この関数で、pbar2はローカル変数なので呼び出しのたびに新しく作られ、呼び出しが終われば消えます。

displayの真理値がTrueならpbar2に対して代入する処理が走るので問題ありませんが、Falseになってelse節が実行されるときはpbar2はその呼び出しにおいては存在していないので、質問文の通りのエラーになります。

とりあえずglobal宣言をしてグローバル変数にしてしまえばエラーは消えます。

python

1def progressbar(display): 2 global pbar2 3 # 以下略

ただし、重い処理が回っている間は画面の更新処理が走らないので、期待通りには動かないと思います。本筋ではないのであまり追求しませんが、同様の話題はこのサイトにもたくさん上がっているのでいくつかリンクを貼っておきます。

Python 3.x - Pythonのtkinterを用いたGUIアプリケーションでボタンを押した際の動作が実行できない|teratail
Python 3.x - Python3でGUIをtkinterで後付したい。|teratail
Python - tkinterでappが応答しない|teratail
Python - プログラムを実行した際の応答なしを無くしたい|teratail

投稿2019/03/03 05:57

hayataka2049

総合スコア30933

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

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

renton48

2019/03/03 06:09

ありがとうございます。 本筋ではない部分も参考にさせていただきます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問