我有一個小的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中很好),我必須在窗口外單擊並點擊它才能刷新。現在我已經創建了一個菜單,我也可以點擊菜單中的一個按鈕來獲取更新。
你試過調用'self.update_idletasks()'嗎? http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.update_idletasks-method – atlasologist
FWIW,而不是'... get(1.0,END)[: - 1]'你可以使用'... get(1.0,「end-1c」)' –
@atlasologist,是的,在每個組件上,沒有成功 – hithwen