Переключение открытого окна tkinter с помощью ярлыка - PullRequest
1 голос
/ 24 мая 2019

Я далек от опытного программиста / сценариста, и это мой первый проект, содержащий пользовательский интерфейс (tkinter).

У меня на клавиатуре есть клавиша привязки к функции для открытия окна.Я использую что-то вроде этого, чтобы связать это с ключом:

root.bind('<s>', popupmsg)

Это функция, которую я вызываю:

def popupmsg(msg):
    global MSGroot
    MSGroot = Tk()

    lab1.config("test")
    lab1= Label(MSGroot, font=('times', 40), bg='blue', fg="red")
    lab1.grid(row=0, column=1)

    MSGroot.title("TIME")
    MSGroot.call('wm', 'attributes', '.', '-topmost', '1')
    MSGroot.mainloop()

Этот код работает иотображает окно очень хорошо, однако я хотел бы найти элегантный способ просто включать и выключать это окно, используя одну и ту же привязку клавиш.

Есть предложения?

1 Ответ

0 голосов
/ 24 мая 2019

Есть много предложений, которые сделают ваш код более приятным / элегантным.

Во-первых, не используйте окно Tk() для всплывающего окна.окно, используйте окно TopLevel(), два окна Tk() не могут передавать информацию друг другу, поэтому вместо этого используйте окно TopLevel().

def popupmsg(msg):
        global MSGroot
        MSGroot = TopLevel(root) # needs the main Tk() window as a master/parent element

        lab1.config("test")
        lab1= Label(MSGroot, font=('times', 40), bg='blue', fg="red")
        lab1.grid(row=0, column=1) 

        MSGroot.title("TIME")
        MSGroot.call('wm', 'attributes', '.', '-topmost', '1')

Во-вторых, вы должны создатьклассы для создания окон Tk и TopLevel, это просто лучше форматирует ваш код и более функционально для внесения изменений в работу окон.

class PopUpMsg(Toplevel):

    def __init__(self, master, msg):
        super(PopUpMsg, self).__init__(master)

        lab1 = Label(self, font=('times', 40), bg='blue', fg="red")
        lab1.grid(row=0, column=1)

        self.title("TIME")
        self.call('wm', 'attributes', '.', '-topmost', '1')


# This is now the function you could use to show the popup
def popupmsg(msg): 
    test_popup = PopUpMsg(root, msg) # This is how you would create the PopUpMsg
    test_popup.pack()


root = Tk()
root.mainloop()

Наконец, чтобы сделатьтак что тогда, когда вы снова нажмете «s», окно закроется, я создам on_close метод для этого нового PopUpMsg класса и свяжу с ним «s».

class PopUpMsg(Toplevel):

    def __init__(self, master):
        super(PopUpMsg, self).__init__(master)

        lab1 = Label(self, font=('times', 40), bg='blue', fg="red")
        lab1.grid(row=0, column=1)

        self.title("TIME")
        self.bind('<s>', self.on_close)

    def on_close(self):
        self.destroy()
...