Windows XP上的Tkinter激活窗口

时间:2014-05-09 15:55:33

标签: python python-3.x tkinter python-3.4

我有一个小的GUI应用程序,用于侦听网络消息,以便用户可以更新某些信息并接受它。这是在生产工厂环境中,用于与特定的物理硬件进行交互(在某些情况下通过串行)。工作流程如下所示:

  • 用户正在与另一个程序进行交互(5250绿屏)
  • 他们输入一个特定的键绑定,将一条UDP消息发送到Tkinter GUI
  • Tkinter GUI执行deiconify()
  • 用户编辑数据,接受(回车)并执行iconify()

我的问题是在Windows XP上,当我执行deiconify时,GUI不会变为活动状态,反之则不会回到iconify上的前一个窗口。我尝试过其他一些问题,比如:

  • 将Tk GUI设置为顶部.. self.wm_attributes("-topmost", 1)
  • 尝试设置/强制关注... self.focus_set()self.focus_force()

尽管第一个窗口是可见的,但我似乎无法将其作为活动窗口,因此用户无需“单击”它即可键入以激活它。释放“焦点”也是如此,以便活动窗口成为他们之前所使用的窗口(5250)。

这似乎是其他人也有的问题,但我找不到任何有用的东西。是否有一种编程方式可以激活窗口并在完成后释放它?

1 个答案:

答案 0 :(得分:0)

不幸的是,一周之后没有答案,我无法找到直接的方式与Tkinter这样做。我确实找到了一种解决问题的方法,但它似乎始终如一地工作。以下是我为激活屏幕所采取的步骤:

  • 安装pywin32。
  • 创建一个激活tk app的功能。
  • 创建一个激活5250的功能。

然后每次我进行iconify / deiconify时,我也会运行该功能来激活相应的屏幕。激活tk窗口的代码如下所示:

def activate_self(self):
    """ Activate this window. """
    shell = win32com.client.Dispatch('WScript.Shell')
    shell.AppActivate(str(self.title))
    shell = None

激活调用者的代码有点难看,因为它必须猜测标题但是基本概念是相同的。