2017-08-29 30 views
1

所以基本上我試圖使多個進度條,每個progressbar的值從0運行到100.但現在我的函數使用其他值這看起來很奇怪。希望有人能幫助我。謝謝:)Python - Tkinter(ttk)動態創建一個自己的值改變的進度條

# -*- coding: utf-8 -*- 
import tkinter.ttk as ttk 
import tkinter as tk 
from threading import Thread 
import time 

class Main(object): 
    def __init__(self, master): 
     self.master = master 

     self.frame = tk.Frame(self.master, width=400, height=400) 
     self.frame.pack(expand=True) 

     self.button = tk.Button(self.frame, text="Add Bar", command=self.start_thread) 
     self.button.pack(fill="y") 

    def start_thread(self): 
     self.t = Thread(target=self.add_bar) 
     self.t.start() 

    def add_bar(self): 
     self.var = tk.IntVar() 
     self.var.set(0) 

     self.progessbar = ttk.Progressbar(self.frame, variable=self.var, orient=tk.HORIZONTAL, length=200) 
     self.progessbar.pack() 

     self.add_values(self.var) 

    def add_values(self, var): 
     self.variable = var 
     for self.x in range(100): 
      time.sleep(0.1) 
      self.variable.set(self.x) 


root = tk.Tk() 
app = Main(root) 
root.mainloop() 

回答

3

在您的原始代碼中,self.var是存儲加載欄進度的唯一變量。由於主對象只有一個實例,因此只有一個self.var實例會導致您描述的問題。爲了解決這個問題,我建議創建用於加載條單獨的類,如下所示:

# -*- coding: utf-8 -*- 
import tkinter.ttk as ttk 
import tkinter as tk 
from threading import Thread 
import time 

class Main(object): 
    def __init__(self, master): 
     self.master = master 

     self.frame = tk.Frame(self.master, width=400, height=400) 
     self.frame.pack(expand=True) 

     self.button = tk.Button(self.frame, text="Add Bar", command=lambda:self.createBar()) 
     self.button.pack(fill="y") 

    def createBar(self): 
     self.t = Thread(target=self.create) 
     self.t.start() 

    def create(self): 
     newBar = LoadingBar(self.master, self.frame) 

class LoadingBar(object): 
    def __init__(self, master, frame): 
     # Must use same Tkinter frame to add loading bars into 
     self.master = master 
     self.frame = frame 
     self.add_bar() 

    def start_thread(self): 
     self.t = Thread(target=self.add_bar) 
     self.t.start() 

    def add_bar(self): 
     self.var = tk.IntVar() 
     self.var.set(0) 

     self.progessbar = ttk.Progressbar(self.frame, variable=self.var, orient=tk.HORIZONTAL, length=200) 
     self.progessbar.pack() 

     self.add_values(self.var) 

    def add_values(self, var): 
     self.variable = var 
     for self.x in range(100): 
      time.sleep(0.1) 
      self.variable.set(self.x) 

root = tk.Tk() 
app = Main(root) 
root.mainloop() 

創建加載條的每個實例在單獨的線程允許所期望的效果。

這裏是另一種方法(沒有新的類):

# -*- coding: utf-8 -*- 
import tkinter.ttk as ttk 
import tkinter as tk 
from threading import Thread 
import time 

class Main(object): 
    def __init__(self, master): 
     self.master = master 

     self.frame = tk.Frame(self.master, width=400, height=400) 
     self.frame.pack(expand=True) 

     self.button = tk.Button(self.frame, text="Add Bar", command=self.start_thread) 
     self.button.pack(fill="y") 

    def start_thread(self): 
     self.t = Thread(target=self.add_bar) 
     self.t.start() 

    def add_bar(self): 
     var = tk.IntVar() 
     var.set(0) 

     progessbar = ttk.Progressbar(self.frame, variable=var, orient=tk.HORIZONTAL, length=200) 
     progessbar.pack() 

     self.add_values(var) 

    def add_values(self, var): 
     variable = var 
     for x in range(100): 
      time.sleep(0.1) 
      variable.set(x) 


root = tk.Tk() 
app = Main(root) 
root.mainloop() 

注:爲每個線程創建局部變量,而不是實例變量,以避免實例變量的覆蓋。