写入文本时,Tkinter在MacOs上没有刷新

hit*_*wen 5 python macos user-interface tkinter

我有一个小的Tkinter应用程序来显示一些串行通信.它有两个Text组件(user_input和log)和一个'Send'按钮.

当按下"发送"时,在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)
Run Code Online (Sandbox Code Playgroud)

此方法还每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()
Run Code Online (Sandbox Code Playgroud)

这在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)
Run Code Online (Sandbox Code Playgroud)

这导致窗口在MacOS中停止刷新(它在linux和windows中工作正常),我必须在窗口外单击并单击返回以进行刷新.现在我已经找到了一个菜单,我也可以点击菜单中的一个按钮来获取更新.

小智 1

如果您运行的是 OSX 10.9 (Mavericks),则这很可能就是问题所在。我建议更新您当前版本的 Tcl/Tk,甚至更新到最新版本的 Python(特别是如果您仍在使用 3.3)。希望这可以帮助!