2017-11-13 18 views
0

プログレスバーを作成するPythonコードがあります。 Tkinter環境は、Gui関数でプログレスバーとともに作成され、スレッドとして起動されます。その後、他のスレッドではプログレスバーの値を計算しますが、プログレスバーの新しい値でGuiスレッドを更新する方法はわかりません。私のコードは次のとおりです:スレッドのプログレスバーを更新する

import tkinter as tk 
from tkinter import ttk 
import thread 

def Gui(): 
    root = tk.Tk() 
    root.geometry('450x450') 
    root.title('Hanix Downloader') 

    button1 = tk.Button(root, text='Salir', width=25,command=root.destroy) 
    button1.pack() 

    s = ttk.Style() 
    s.theme_use('clam') 
    s.configure("green.Horizontal.TProgressbar", foreground='green', background='green') 

    mpb = ttk.Progressbar(root,style="green.Horizontal.TProgressbar",orient ="horizontal",length = 200, mode ="determinate") 
    mpb.pack() 
    mpb["maximum"] = 3620 
    mpb["value"] = 1000 

    root.mainloop() 

def main(): 
while True: 
    #Calculate the new value of the progress bar. 
    mpb["value"] = 100 #Does not work 
    root.update_idletasks()#Does not work 
    #Do some other tasks. 


if __name__ == '__main__': 
thread.start_new_thread(Gui,()) 
thread.start_new_thread(main,()) 

エラーはmpbとルートが存在しないことです。前もって感謝します。

+0

このサイトには、tkinter、スレッド、およびプログレスバーに関する多くの質問と回答があります。あなたはこの質問をする前に研究をしていませんか?また、コード例でインデントを修正する必要があります。 –

+0

はい、私はいくつかのポストと質問を見ましたが、私はそれを解決することができません、申し訳ありません...私はこれで5時間を費やしました。 – Andermutu

+0

コンソールで実行すると、エラーメッセージ(トレースバック)が表示されましたか?常に問題を提示してください。 'mpb'と' root'は 'Gui()'にのみ存在し、 'main()'には存在しないので、エラーが発生するでしょう – furas

答えて

1

mpbrootGuiでなくmainにのみ存在するローカル変数であるため、あなたはエラーを取得する必要があります。 (その後、main時々mainGuiその後、より速く開始することができ、それがmpbを見つけられないことがあるので、私はまたwhile True:time.sleep(1)を追加Gui

で作成mpbにアクセスする必要があります - あなたは、グローバル変数を使用するように両方の機能を知らせるためにglobalを使用する必要がありますGui)はPythonの3.6.2でテスト

import tkinter as tk 
from tkinter import ttk 
import _thread 
import time 

def Gui(): 
    global root, mpb 

    root = tk.Tk() 

    button1 = tk.Button(root, text='Exit', command=root.destroy) 
    button1.pack() 

    mpb = ttk.Progressbar(root, mode="determinate") 
    mpb.pack() 

    mpb["maximum"] = 3000 
    mpb["value"] = 1000 

    root.mainloop() 


def main(): 
    global root, mpb 

    time.sleep(1) 

    while True: 
     mpb["value"] += 100 
     #root.update_idletasks() # works without it 

     #Do some other tasks. 
     time.sleep(0.2) 


if __name__ == '__main__': 
    _thread.start_new_thread(Gui,()) 
    _thread.start_new_thread(main,()) 

、Linuxのミント18.2

をプログレスバーを作成する時間がなかったので、

EDIT:より正確:それは変数
root = ...mpb = ...に値を割り当てるので、あなただけのGuiglobalを必要としています。

+0

答えをありがとう、あなたは素晴らしいです。しかし、私が終了ボタンを押したとき私は私のコンソールでこのエラーメッセージが表示されます:RuntimeError:メインスレッドはメインループにありません – Andermutu

+0

'exit'ウィンドウを閉じますが、' main'スレッドはまだ動いています - 'root.destroy '。 'main'では' while running: 'を使用し、' Gui'では 'runnig = False'を設定することができます。スレッドを使った作業は複雑になることがあり、スレッドの代わりに 'root.after()'を使う方が簡単な場合もあります。 – furas

+0

ありがとうございます...あなたは最高です。 – Andermutu

関連する問題