метка окна не печатается: Python

#python #tkinter

#python #tkinter

Вопрос:

Я хочу создать два окна.

Поведение Windows:

Window1 имеет a label и a button . Когда я нажимаю на это button , должно открыться 2-е окно. во 2-м окне есть label .

Проблема:

Label во 2-м окне не отображается.

Код:

 def window1():
    root = tkinter.Tk()
    root.geometry("200x200")
    root.title("Window1")
    var = tkinter.StringVar()

    tkinter.Label(root,  textvariable = var, bg = "red").grid(row = 0, column = 0)
    var.set("This is window1")

    tkinter.Button(root, text = "Button1", command = OnBut).grid(row =  0, column = 1)

    root.mainloop()

def OnBut():
    window2()

def window2():
    root = tkinter.Tk()
    root.title("Window2")
    root.geometry("250x250")

    var = tkinter.StringVar()

    tkinter.Label(root,  textvariable = var, bg = "blue").grid(row = 1, column = 0, padx = 3, pady = 3)
    tkinter.Button(root, text = "Button", command = OnBut).grid(row =  0, column = 1, padx  =3, pady = 3)
    var.set("This is window2")       #not appearing <-- problem

    root.mainloop()

window1()
 

когда я вызываю window2 отдельно, он работает нормально. Почему label бы не печатать во 2-м окне, нажав на button ?

Комментарии:

1. корень не определен в onBut() методе

2. извините @PadraicCunningham. Теперь я обновился правильно.

3. вы изменили onBut метод, проблема не window2 принимает аргумент.

4. сколько раз вы собираетесь менять свой код?? root1 не определен. Что именно должно произойти? Когда я нажимаю кнопку на window1, открывается window2, что еще должно произойти?

5. Вы неправильно используете Tkinter. Вы никогда не должны создавать второй экземпляр Tk . Если вам нужно более одного окна, создайте экземпляры Toplevel .

Ответ №1:

В данном случае вам на самом деле не нужна реальная функция для вашего command использования. Это то, для чего lambda s созданы — обратные вызовы!

Удалите свою onBut функцию (которая в любом случае является проблемой, поскольку root там не определена) и замените свою command в каждой кнопке на:

 command = lambda: window2(root)
 

В настоящее время, когда вы вызываете onBut , он пытается сделать:

 window2(root)
# HELP I DON'T KNOW WHAT root IS!!
 

Это бросает NameError вызов моей копии. Ваш код может отличаться.

Поскольку вы волей-неволей редактируете, позвольте мне просто написать вам какой-нибудь рабочий код.

 import tkinter

def run():
    root = tkinter.Tk()
    root.title("Window1")
    s_var = tkinter.StringVar()
    tkinter.Label(root, textvariable = s_var).pack()
    tkinter.Button(root, text = "Button", command = lambda: makewindow(root)).pack()
    s_var.set("Window #1")

def makewindow(root):
    top = tkinter.Toplevel(root)
    top.title("Window2")
    s_var = tkinter.StringVar()
    tkinter.Label(top, textvariable = s_var).pack()
    tkinter.Button(top, text = "Button", command = lambda: makewindow(root)).pack()
    s_var.set("Window #2")

if __name__ == "__main__":
    run()
 

Комментарии:

1. @SGG Боюсь, вы, похоже, не совсем понимаете проблему, поэтому я не думаю, что смогу вам помочь. Вы изменили свой код, чтобы сделать его все более и более неправильным =/

2. Прошу прощения. Теперь вы можете попробовать.

3. @SGG Я уже правильно ответил на ваш вопрос. В вашем новом коде появилось множество новых ошибок. Например, теперь у вас есть два tkinter.Tk объекта, что плохо.

4. что делать, если у меня есть tkinter.tk объекты. оба они разные, верно?

5. @SGG вы не можете управлять двумя машинами одновременно, не так ли? Точно так же не пытайтесь запускать два экземпляра Tk одновременно.