Окно активации Tkinter в Windows XP
У меня есть небольшое приложение с графическим интерфейсом, которое прослушивает сетевые сообщения, чтобы пользователь мог обновить некоторую информацию и принять ее. Это в производственной среде и используется для взаимодействия с определенным физическим оборудованием (в некоторых случаях - с последовательным интерфейсом). Рабочий процесс выглядит так:
- Пользователь взаимодействует с другой программой (5250 Green Screen)
- Они вводят определенную привязку клавиш, которая отправляет UDP-сообщение в графический интерфейс Tkinter.
- Графический интерфейс Tkinter делает deiconify()
- Пользователь редактирует данные, принимает (Enter) и делает иконку ()
Моя проблема заключается в том, что в Windows XP GUI не становится активным, когда я делаю deiconify, и наоборот, не возвращается к предыдущему окну при iconify. Я пробовал некоторые вещи, которые я нашел в других вопросах, таких как:
- Установка Tk GUI в качестве верхней..
self.wm_attributes("-topmost", 1)
- Попытка установить / заставить фокус...
self.focus_set()
а такжеself.focus_force()
Хотя окно видно с первым, я не могу заставить его быть активным, чтобы пользователь мог вводить его, не щелкая по нему, чтобы активировать. То же самое верно для освобождения "фокуса", так что активное окно становится тем, на котором они были ранее (5250).
Это похоже на проблему, с которой столкнулись и другие, но я не смог найти ничего, что работает. Есть ли программный способ активировать окно и отпустить его, когда закончите?
1 ответ
К сожалению, через неделю не было ответов, и я не смог найти прямой способ сделать это с Tkinter. Я нашел способ решить эту проблему, и он работает последовательно. Вот шаги, которые я предпринял, чтобы активировать экраны:
- Установите pywin32.
- Создайте функцию, которая активирует приложение tk.
- Создайте функцию, которая активирует 5250.
Затем каждый раз, когда я делаю иконку /deiconify, я также запускаю функцию, чтобы активировать соответствующий экран. Код, который активирует окно tk, выглядит следующим образом:
def activate_self(self):
""" Activate this window. """
shell = win32com.client.Dispatch('WScript.Shell')
shell.AppActivate(str(self.title))
shell = None
Код, который активирует вызывающую программу, немного уродлив, поскольку должен угадывать заголовок, но имеет ту же базовую концепцию.