2014-03-31 22 views
5

我有一個小的Tkinter應用程序來顯示一些串行通信。 它有兩個文本組件(user_input和log)和一個「發送」按鈕。當寫入文本時,Tkinter不會在MacOs上刷新

當按下'發送'時,無論在user_input中寫入什麼,都會發送到串行。

def send_clicked(self): 
    data = self.user_input.get(1.0, END)[:-1] + '\0' 
    self.serial.write(str(data)) 
    self.user_input.delete(1.0, END) 

而且這種方法運行,每100毫秒時間在日誌文本組件顯示串行輸出:

def read_serial(self): 
    self.log.update() # display input text 
    self._read_character() 
    self.after(100, self.read_serial) # check serial again soon 

def _read_character(self): 
    c = self.serial.read() # attempt to read a character from Serial 
    # was anything read? 
    while len(c) > 0: 
     # get the buffer from outside of this function 
     # check if character is a delimeter 
     if c == '\r': 
      c = '' # don't want returns. chuck it 
     if c == '\n': 
      self.serial_buffer += "\n" # add the newline to the buffer 
      self.log.insert(END, self.serial_buffer) 
      self.log.yview(END) 
      self.serial_buffer = "" # empty the buffer 
     else: 
      self.serial_buffer += c # add to the buffer 
     c = self.serial.read() 

這工作在Windows,Linux和Mac的罰款。

現在我想在答覆文本,當用戶點擊「發送」打印「>>價值」,所以我重新send_clicked:

def send_clicked(self): 
    data = self.user_input.get(1.0, END)[:-1] + '\0' 
    self.serial.write(str(data)) 
    self.log.insert(END, '>> %s\n' % data) 
    self.log.yview(END) 
    self.user_input.delete(1.0, END) 

這導致窗口停止在MacOS上刷新(它的工作原理在Linux和Windows中很好),我必須在窗口外單擊並點擊它才能刷新。現在我已經創建了一個菜單,我也可以點擊菜單中的一個按鈕來獲取更新。

+0

你試過調用'self.update_idletasks()'嗎? http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.update_idletasks-method – atlasologist

+1

FWIW,而不是'... get(1.0,END)[: - 1]'你可以使用'... get(1.0,「end-1c」)' –

+0

@atlasologist,是的,在每個組件上,沒有成功 – hithwen

回答

1

如果您正在運行OSX 10.9(小牛),則可能是this是問題所在。我建議更新你當前的Tcl/Tk版本,甚至更新到最新版本的Python(尤其是如果你仍然在使用3.3)。希望這可以幫助!

+0

我使用python 2.7.6,我用python安裝了macports,其中py27-tkinter是一個單獨的包,所以我刪除了macports python安裝並從官方安裝程序和activetcl包一起重新安裝,但問題persits – hithwen

相關問題