Интерфейс обмена при нажатии кнопки

Я новичок в Tkinter, и я хочу создать кнопку, которая при нажатии отображает второй интерфейс. Я написал следующую программу:

import Tkinter root = Tkinter.Tk( ) root.title("My First Game") for r in range(3): for c in range(3): Tkinter.Label(root, text= '3', borderwidth=20 ).grid(row=1,column=1) Tkinter.Label(root, text= '6', borderwidth=20 ).grid(row=1,column=2) Tkinter.Label(root, text= '4', borderwidth=20 ).grid(row=1,column=3) Tkinter.Label(root, text= '2', borderwidth=20 ).grid(row=2,column=1) Tkinter.Label(root, text= '7', borderwidth=20 ).grid(row=2,column=2) Tkinter.Label(root, text= ' ', borderwidth=20 ).grid(row=2,column=3) Tkinter.Label(root, text= '5', borderwidth=20 ).grid(row=3,column=1) Tkinter.Label(root, text= '1', borderwidth=20 ).grid(row=3,column=2) Tkinter.Label(root, text= '8', borderwidth=20 ).grid(row=3,column=3) def mainprg(): for r in range(3): for c in range(3): Tkinter.Label(root, text= '3', borderwidth=20 ).grid(row=1,column=1) Tkinter.Label(root, text= '6', borderwidth=20 ).grid(row=1,column=2) Tkinter.Label(root, text= ' ', borderwidth=20 ).grid(row=1,column=3) Tkinter.Label(root, text= '2', borderwidth=20 ).grid(row=2,column=1) Tkinter.Label(root, text= '7', borderwidth=20 ).grid(row=2,column=2) Tkinter.Label(root, text= '4', borderwidth=20 ).grid(row=2,column=3) Tkinter.Label(root, text= '5', borderwidth=20 ).grid(row=3,column=1) Tkinter.Label(root, text= '1', borderwidth=20 ).grid(row=3,column=2) Tkinter.Label(root, text= '8', borderwidth=20 ).grid(row=3,column=3) B = Tkinter.Button(text = "Run", command = mainprg) B.pack() root.mainloop() 

Я пытаюсь отобразить первый интерфейс и кнопку « Запустить» . После нажатия кнопки « Выполнить» должен отображаться второй интерфейс. Но после запуска вышеуказанного кода он ничего не отображает.

2 Solutions collect form web for “Интерфейс обмена при нажатии кнопки”

Вы смешиваете grid и pack (это плохая идея, см., Например, https://stackoverflow.com/a/3968033/3001761 ); измените назначение B на:

 B = Tkinter.Button(text = "Run", command = mainprg) B.grid(row=4, column=1) 

Кроме того, ваши петли делают то же самое 9 раз без видимых причин; вы должны, вероятно, переосмыслить логику.

Вот пример, который делает часть того, что вы пытаетесь сделать. Обратите внимание на использование списка ссылок на метку, которые необходимо заменить. Если использование clean метода не выполняется, вы просто «перезаписываете» предыдущий вид экрана, и это может привести к сломанному интерфейсу, когда часть кнопки видима частично восстановлена ​​другими объектами.

 import Tkinter as Tki #constants - using this you can eventually change the interface's language by importing a different file containning these values. __title__ = "my first program" __run__ = "run!" #widgets contain all the currently created widgets, this will alow to destroy and replace them. global widgets widgets = [] #--------------------------------------------------------------------------------------------------- def clean(): for widget in widgets: widget.grid_remove() widget.destroy() #--------------------------------------------------------------------------------------------------- def createMainButton(master): clean() #it is required to specify the master, ie the container of each new widget as first parameter button = Tki.Button(root, text = __run__, command = lambda : mainProg(root)) button.grid(row=0, column=0) #have to provide a reference to the widget to allow clean destroy of it. widgets.append(button) #--------------------------------------------------------------------------------------------------- def mainProg(master): clean() #define a subclass def create (content, row, column): createLabel(master, content , 20, row , column) #create widgets create('3', 1, 1) create('6', 1, 2) create('4', 1, 3) create('2', 2, 1) create('7', 2, 2) create(' ', 2, 3) create('5', 3, 1) create('1', 3, 2) create('8', 3, 3) #--------------------------------------------------------------------------------------------------- def createLabel(master, content, borderSize, row, column): label = Tki.Label(master, text= content, borderwidth=borderSize ) label.grid(row=row,column=column) widgets.append(label) if __name__ == "__main__": root = Tki.Tk() root.title(__title__) createMainButton(root) root.mainloop() 

Я не знаю, что вы знаете об Object Programming, но рассмотрите другой способ достижения своей цели: расширить класс Tk, чтобы обеспечить доступ к требуемым данным внутри определенной области без определения глобальных переменных (то есть, в общем, ПЛОХО! ). Я лично буду его кодировать так:

 import Tkinter as Tki #constants - using this you can eventually change the interface's language by importing a different file containning these values. __title__ = "my first program" __run__ = "run!" class MyProgram(Tki.Tk): def __init__(self): Tki.Tk.__init__(self) self.widgets = [] self.CONSTANT_BORDERWIDTH = 20 self.title(__title__) self.createMainButton() def clean(self): for widget in self.widgets: widget.grid_remove() widget.destroy() def createMainButton(self): self.clean() #it is required to specify the master, ie the container of each new widget as first parameter button = Tki.Button(self, text = __run__, command = self.mainProg) button.grid(row=0, column=0) #have to provide a reference to the widget to allow clean destroy of it. self.widgets.append(button) def mainProg(self): self.clean() #create widgets self.createLabel('3', 1, 1) self.createLabel('6', 1, 2) self.createLabel('4', 1, 3) self.createLabel('2', 2, 1) self.createLabel('7', 2, 2) self.createLabel(' ', 2, 3) self.createLabel('5', 3, 1) self.createLabel('1', 3, 2) self.createLabel('8', 3, 3) def createLabel(self,content, row, column): label = Tki.Label(self, text= content, borderwidth=self.CONSTANT_BORDERWIDTH ) label.grid(row=row,column=column) self.widgets.append(label) if __name__ == "__main__": root = MyProgram() root.mainloop() 

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

Удачи! Артур.

Python - лучший язык программирования в мире.