2015-10-07 48 views
-2

我想用一些刷新每個給定時間間隔的數據填充我的屏幕。我使用的是Python3,主題tkinter。每次我的屏幕更新時,我都會在屏幕上看到每個標籤的灰色閃爍。有沒有辦法避免這種情況? P.S:我正在調用'after'方法來刷新數據。在ttk GUI更新過程中令人討厭的灰色閃爍

更新:下面是一些示例代碼:

def button1Click(self): 
    self.top = Toplevel(width=600,height=400) 
    self.top.title("XYZ ORGANIZATION") 
    self.frame1 = Frame(self.top,bg='#009999') 
    self.frame1.pack() 
    self.noOfEmp = Label(self.frame1,text = "Number_Of_Employees : ", font =('Verdana',9, 'bold'),bg='#009999',fg = '#000000') 
    self.noOfEmp.grid(row=1,column=0,sticky=W,padx=0,pady=5) 
    self.TeamLabel = Label(self.frame1,text = "Team Name : ", font =('Verdana',9, 'bold'),bg='#009999',fg = '#000000') 
    self.TeamLabel.grid(row=2,column=0,sticky=W,padx=0,pady=5)  

    self.text = Text(self.frame1, bg='#009999') 
    self.text.grid(row=8,columnspan=17) 
    self.old_emp = 0 
    self.EFile = open('/abc','r').readlines() 
    for line in self.EFile: 
     if line.startswith('EmpTotal:'): 
      self.Tot_Emp = int(line.split()[1]) 
      break 
    t1 = threading.Thread(target=self.__make_layout, args =()) 
    t1.daemon = True 
    t1.start() 
    t2 = threading.Thread(target=self.ProcEmp,args =()) 
    t2.daemon = True 
    t2.start() 

def self.__make_layout: 
    self.CLabelVal = Label(self.frame1,text = CSpace, font=('Verdana',9),bg='#009999',fg = '#000000') 
    self.MLabelVal = Label(self.frame1,text = MSpace , font =('Verdana',9),bg='#009999',fg = '#000000') 
    self.Label1Val.grid(row=4,column=1,sticky=W+E+N+S,padx=5,pady=5)        
    self.Label2Val.grid(row=5,column=1,sticky=W+E+N+S,padx=5,pady=5) 
    self.frame1.after(5000,self.__make_layout) 
+2

可能有一種方法。沒有看到重複問題的代碼,我懷疑有什麼方法可以給你一個有用的答案。請參閱http://www.stackoverflow.com/help/mcve。 –

+0

添加到您的問題,你可以得到的*最簡單*的代碼,顯示你的問題。同上Bryan的答案。 –

+0

我使用'after'填充和刷新每隔2秒的數據間隔。所以每次在我的GUI上更新數據時,我都會看到一些灰色背景塊用於輸出數據。由於每2秒顯示不同的數字,所以灰色閃爍不斷出現。 – Dee

回答

0

部分是,你不斷堆疊在彼此的頂部越來越多的小部件。您應該只創建一次標籤,然後每五秒更改一次顯示內容,而不是每五秒創建一次新的窗口小部件。

還有一個問題就是你在線程中創建標籤。 Tkinter不是線程安全的。任何創建或修改小部件的代碼都需要位於主線程中。要更新標籤,您不需要線程,但可以使用線程來更改實際顯示的內容。

def __make_layout(self): 
    self.CLabelVal = Label(...,text = CSpace, ...) 
    self.MLabelVal = Label(...,text = MSpace, ...) 
    self.Label1Val.grid(...)        
    self.Label2Val.grid(...) 

def __update_layout(self): 
    self.CLabelVal.configure(text=CSpace) 
    self.MLabelVal.configure(text=MSpace) 
    self.after(5000, self.__update_layout) 
+0

完全工作!非常感謝您的幫助! – Dee

0

我做根據您提供什麼樣的小程序。

這就是我得到的。我選擇了500毫秒,因爲我不想等那麼久。我同時運行了兩個互聯網視頻,沒有任何問題。 所以我最好猜你有一個緩慢的視頻卡或超載的電腦。

from tkinter import * 

class MyClass: 

    frame1 = Tk() 
    poll = 0 

    def __init__(self): 
     self.frame1.after(500, self.__make_layout) 

    def __make_layout(self): 
     self.poll += 1 
     CSpace = "Poll count = "*20 
     MSpace = str(self.poll) 

     self.CLabelVal = Label(self.frame1, text=CSpace, font=('Verdana', 9), bg='#009999', fg='#000000') 
     self.MLabelVal = Label(self.frame1, text=MSpace, font=('Verdana', 9), bg='#009999', fg='#000000') 
     self.CLabelVal.grid(row=4, column=1, sticky=W+E+N+S, padx=5, pady=5) 
     self.MLabelVal.grid(row=5, column=1, sticky=W+E+N+S, padx=5, pady=5) 
     print(CSpace, MSpace) 
     return self.frame1.after(500, self.__make_layout) 


MyClass() 
mainloop() 
+0

這不是一個很好的例子。它將在幾分鐘內創建數千個標籤小部件。您不需要不斷製作新的小部件,只需修改現有部件的文本即可。 –

+0

我在想同樣的事情,但很懶。沒有太多可去的地方。我正在考慮使用文本變量。 Im新的Tk。 – James

0

這不會創建更多標籤並使用「textvariable」更新功能。問題的

from tkinter import * 


class MyClass: 
    frame1 = Tk() 
    poll = 0 
    textstg = StringVar() 
    CSpace = "Poll count" 

    def __init__(self): 
     self.frame1.after(500, self.__make_layout) 
     self.CLabelVal = Label(self.frame1, text=self.CSpace, font=('Verdana', 9), bg='#009999', fg='#000000') 
     self.MLabelVal = Label(self.frame1, textvariable=self.textstg, font=('Verdana', 9), bg='#009999', fg='#000000') 
     self.CLabelVal.grid(row=4, column=1, sticky=W+E+N+S, padx=5, pady=5) 
     self.MLabelVal.grid(row=5, column=1, sticky=W+E+N+S, padx=5, pady=5) 

    def __make_layout(self): 
     self.poll += 1 
     self.textstg.set(str(self.poll)) 
     return self.frame1.after(50, self.__make_layout) 

MyClass() 
mainloop() 
+0

謝謝@詹姆斯,我會嘗試使用民意調查。 – Dee