2

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

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

我的问题是,在 Windows XP 上,当我执行 deiconify 时,GUI 不会变为活动状态,相反,它不会退回到 iconify 上的前一个窗口。我尝试了一些我在其他问题中发现的东西,例如:

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

虽然第一个窗口是可见的,但我似乎无法让它成为活动窗口,以便用户可以在不“单击”它的情况下输入它来激活。释放“焦点”也是如此,以便活动窗口变为它们之前所在的窗口(5250)。

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

4

1 回答 1

0

不幸的是,一周后没有答案,我无法找到使用 Tkinter 的直接方法。不过,我确实找到了解决问题的方法,而且它似乎始终如一地工作。以下是我为激活屏幕而采取的步骤:

  • 安装 pywin32。
  • 创建一个激活 tk 应用程序的函数。
  • 创建一个激活 5250 的函数。

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

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

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

于 2014-05-15T15:34:04.503 回答