【问题标题】:Python tkinter button.invoke method troublePython tkinter button.invoke 方法麻烦
【发布时间】:2013-06-18 22:25:53
【问题描述】:

我正在使用运动控制器,因此要“单击”一个按钮,我会找出在任何给定点最靠近中间的按钮,然后使用 button.invoke() 方法。

我相信按钮和设置工作正常,因为每当我点击按钮时,它们都能正常工作。但是,当通过“button.invoke”方法调用按钮时,整个事情就冻结了。

其他可能有用的信息: - gui 正在通过 .mainloop 函数在它自己的线程中更新。 - 用鼠标点击时一切正常 - button.invoke() 方法工作正常 - 在执行简单的打印操作时。仅在切换帧时冻结。

任何帮助都会很棒,谢谢。

【问题讨论】:

  • 你能分享一些代码来向我们展示更多的工作原理,尤其是关于button.invoke()内部发生的事情吗?
  • 另外,button.invoke 是从与mainloop 不同的线程调用的吗?这在 tkinter 中是不合法的;它可能在某些情况下有效,但在其他情况下无效,或者相同的情况有时但并非总是有效,或者它可能在一个平台或 Tk 版本上有效,但在另一个平台或 Tk 版本上无效,等等——但如果它曾经有效,那只是因为你得到了幸运的;这是不应该的。
  • 我认为你已经解决了问题。问题是线程 A 正在运行 mainloop(),它只是在等待某些东西,所以它永远不会离开那条线。线程 B 在使用运动控制器时调用按钮。在这一点上,我真的应该将我的问题改为“我如何只在有限的时间内运行“Mainloop”?或者改变一些东西,以便 mainloop 处理改变”

标签: python tkinter


【解决方案1】:

您是说 mainloop 在与您创建小部件的位置不同的线程中运行吗?如果是这样,那是你的问题。您只能从一个线程调用 tkinter 函数。

【讨论】:

  • 对不起,我应该更清楚。所以这里有问题: Thead A - 负责在它的初始化中制作 GUI,并运行“a.mainloop()” 当它检测到它自己的按钮点击时这很好。线程 B - 控制运动相机。因为他们的想法是不使用鼠标,所以我使用“closest_button.invoke()”方法。但是 - 这意味着命令是从线程 B 开始的,因为与按钮单击不同,它不是 gui 上的更改(不是物理按钮按下,只是执行关联的命令),然后线程 A 在其主循环中拾取 - 它是调用命令。
  • @user2498925:您不能从另一个线程运行invoke 方法。常见的解决方案是让您的线程将某些内容放在线程安全队列中,然后让 GUI 线程定期轮询队列。 stackoverflow 上有这样的例子。
  • 然而,问题在于 GUI 线程正在运行 mainloop 函数。并且在 GUI 终止之前不会执行任何其他行。
  • @user2498925: 没有问题 - mainloop 是一个 loop 这意味着它可以定期运行。使用after 将队列安排在未来几毫秒轮询,然后让该函数重新安排自身以进行无限运行的轮询。本站有几个例子,例如:stackoverflow.com/a/2401181/7432
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多