【问题标题】:Swap interface on button press按键切换界面
【发布时间】:2014-12-05 13:47:02
【问题描述】:

我是 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()

我正在尝试显示第一个界面和 Run 按钮。按下 Run 按钮后,将显示第二个界面。但是运行上面的代码后,什么都没有显示。

【问题讨论】:

    标签: python button tkinter


    【解决方案1】:

    这是一个示例,它可以成为您尝试做的事情的一部分。请注意使用必须替换的标签的引用列表。如果没有使用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, i.e. 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()
    

    我不知道您对对象编程有什么了解,但请考虑另一种方法来实现您的目标:扩展 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, i.e. 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()
    

    不管怎样,如果这段代码太难理解,就暂时忘记对象编程吧。

    祝你好运! 亚瑟。

    【讨论】:

      【解决方案2】:

      您正在混合gridpack(这是一个坏主意,请参阅例如https://stackoverflow.com/a/3968033/3001761);将B的赋值改为:

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

      此外,您的 for 循环无缘无故地做了 9 次相同的事情;您可能应该重新考虑逻辑。

      【讨论】:

      • 如果我想通过单击运行按钮来显示上述一系列界面该怎么办?
      • @bio-terror 我真的不知道你想要实现什么,但你可能会发现这很有用:stackoverflow.com/a/26213779/3001761
      • 我为我的程序创建了4个界面,但是点击运行按钮后,它直接跳转到第4个界面,没有考虑第2个和第3个。
      • @bio-terror 究竟是什么,你希望我做什么?猜猜你写了什么代码?如果您有新问题,请提出(通过这个方便的清单:meta.stackoverflow.com/q/260648/3001761)。
      猜你喜欢
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多