#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
одновременно.