【问题标题】:Python tkinter button lagging/printing upon exitPython tkinter 按钮在退出时滞后/打印
【发布时间】:2015-05-31 14:35:18
【问题描述】:

首先请注意,我在 Enthought/Canopy 中执行所有这些操作。

我有这个基本的 GUI,它有 4 个输入框,您可以在其中输入内容,然后您点击一个按钮,它会打印您输入的内容。但是,它并没有按照我想要的方式运行。当您启动代码并输入值并按下按钮时,它不会做任何事情,然后您关闭 gui 窗口并打印您输入的值。

此外,当您输入值并单击一次按钮时,它不会再执行任何操作,但如果您再次单击该按钮,它会打印值,但不会像预期的那样。假设您输入了 1、2、3、4 并按了两次按钮,您在屏幕上看到的内容是 1、2、3、4、1,当您现在关闭窗口时,它会打印出其余部分。

如果你们能帮助我解决这个问题,我将不胜感激。先感谢您。以下是我的代码:

更新:IDLE 不会出现此问题,只有 Canopy 会出现此问题。

from Tkinter import *

class Application:
    def printcmd(self):
        print(self.entrybox.get())

    def __init__(self, master):
        self.entrybox = Entry(master)
        self.button = Button(master, text="print", command = self.printcmd)
        self.entrybox.grid()
        self.button.grid()

root = Tk()
Application(root)
root.mainloop()

【问题讨论】:

  • 我并不是说这会解决您的问题,因此它是评论而不是答案,但 python 是一种垃圾收集语言。如果垃圾收集器参与其中,创建Application 的实例而不将其分配给变量可能会导致奇怪的事情发生。正如我所说,这很可能无法解决您的问题,但值得一试,并且仍然有助于形成良好的编程形式。
  • 我将 Application 更改为 App 并尝试了 c = App(root),但不幸的是我仍然遇到了同样的奇怪行为。让它如此奇怪的是,这是一个非常简单的程序,只有几个代码,但我尝试用 IDLE 运行它,但我在这样做时没有遇到这个问题。

标签: python user-interface button tkinter canopy


【解决方案1】:

如果您在 Canopy GUI 中执行此操作,则应确保 Qt 尚未设置为 GUI 后端。见https://support.enthought.com/hc/en-us/articles/204469880-Using-Tkinter-Turtle-or-Pyglet-in-Canopy-s-IPython-panel

对于打印滞后:Python 缓冲其输出。如果要确保立即打印某些输出,请按照带有sys.stdout.flush() 的打印语句刷新打印输出缓冲区。 (当然要先import sys。)

这可能是任何 Python 程序中的问题。它在 Canopy 中比在 IDLE 中出现的频率更高,因为 Canopy 使用了 IPython 的 QtConsole,它将执行内核与前端类似终端的面板分离为两个独立的操作系统进程。

【讨论】:

  • 感谢您的回答。我这样做了:编辑>首选项> Python>取消选中“使用pylab”,然后重新启动内核,实际上重新启动了一切。仍然没有运气。是的,我正在 Canopy GUI 中运行代码。当我通过 IDLE 运行它时,我没有得到这种行为。
  • 更新了响应以包括刷新打印缓冲区,应该为您修复它。
  • 这对乔纳森很有用。我将您编辑的回复标记为已接受,因此如果有人碰巧遇到同样的问题,他们可以在这里获得帮助。非常感谢您的帮助。
猜你喜欢
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 2011-01-22
相关资源
最近更新 更多