【问题标题】:Python frames tkinterPython 框架 tkinter
【发布时间】:2017-07-24 11:21:50
【问题描述】:

我在使用 tkinter 帧时遇到问题 以下代码必须在左侧显示标签,并且按钮和标签应该有更多空间,我的列/行设置有问题。我做错了什么?

程序显示信息的正确方式是什么? 1个全局框架,里面有几个较小的框架?当使用带有第 1 页第 2 页和第 3 页的菜单时,使用 tkinter, 第 1 页有 3 个输入字段,FramePage1 的子项,第 2 页有 FramePage2 的 2 个按钮子项,第 3 页有 FramePage3 的一个大文本字段子项。它是用于更改页面的正确方法吗

#menu tab1 -> command #calls function page1
def page1():
   self.Framepage2.grid_forget()
   self.Framepage1.grid()
   #content of the page

或者还有其他方法可以使用不同的布局样式页面吗?

import tkinter
import tkinter as tk
class sjabloon():
    def __init__(self):
        #make window
        self.win = tk.Tk()
        self.win.geometry("600x600+10+10")
        #make top frame
        self.frame_header = tk.Frame(self.win, background='black', width=600, height=50)
        self.frame_header.grid(column=0, row=0 , columnspan= 10)
        #make body frame
        self.frame_body = tk.Frame(self.win, width=600, height=400)
        self.frame_body.grid(column=0, row=1 , columnspan= 10)
        #button1 select
        tk.Label(self.frame_body, text="Select:").grid(column=0, row=2, stick='W')
        self.button1 = tk.Button(self.frame_body, text="Select")
        self.button1.grid(row=2, column=5, stick='W')
        #button1 select
        tk.Label(self.frame_body, text="Select:").grid(column=0, row=3, stick='W')
        self.button2 = tk.Button(self.frame_body, text="Select")
        self.button2.grid(row=4, column=5, stick='W')
        #button submit
        self.submit = tk.Button(self.frame_body, text="Start")
        self.submit.grid(row=10, column=9, stick='W')
        #make body footer
        self.frame_footer = tk.Frame(self.win, background='yellow', width=600, height=50)
        self.frame_footer.grid(column=0, row=3 , columnspan= 10)


if __name__ == "__main__":
    sjabloon = sjabloon()

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    我建议你关注这个tkinter GUI tutorial,他做了一个相当大的应用程序,即使它不是你真正想要的,它也会帮助你。

    在第 4 部分中,他在 tkinter GUI 中制作了多帧架构。

    对于切换“页面”,我知道 2 个选择(我认为还有更多,但我不知道,我还是个初学者)。您可以在窗口/框架内创建所有框架并将所需的框架提升到前面(在教程第 4 部分中),或者您可以破坏主体框架内的小部件“第 1 页”并创建小部件“第 2 页”在里面(显然是在方法/函数中让你在页面之间切换)。

    对于您的第一个问题,我不确定我是否理解您的问题,您希望按钮小部件周围有更多空间吗?如果这就是你想要的,你可以使用 padx=(leftPadx,RightPadx) 这样的选项:

    self.button1.grid(row=2, column=5, stick='W', padx=(50,0))
    

    编辑:我为你做了一个小架构(根据我在那个教程中学到的) 基本上,您创建所有“页面”,将它们添加到 bodyFrame 中,然后将您想要的放在前面。为此,对于每个“页面”,您创建一个继承 tk.Frame 的类,并在主窗口中添加该类的一个实例

    import tkinter as tk
    from tkinter import ttk
    
    LARGE_FONT = ("Verdana 12")
    NORM_FONT = "Verdana 10"
    SMALL_FONT = ("Verdana 8")
    ERROR_404 = "Error 404 : Page not found !"
    
    class sjabloon(tk.Tk):
        def __init__(self, *args, **kwargs):
            #make window        
            tk.Tk.__init__(self, *args, **kwargs)
            self.geometry("600x600+10+10")
    
            #make top frame
            self.frame_header = tk.Frame(self, background='black', width=600, height=50)
            self.frame_header.grid(column=0, row=0 , columnspan= 10)
    
            #make body frame
            container = tk.Frame(self, width=600, height=400)
            container.grid(column=0, row=1 , columnspan= 10)
    
            #list of Pages
            self.frames = {}
    
            #everytime you create a "Page", you add it there
            for F in (StartPage, HomePage):
                frame = F(container, self)
                self.frames[F] = frame     
                frame.grid(row=1, column = 0, sticky="nsew", columnspan= 10)
    
            self.show_page("StartPage")
    
    
            #make body footer
            self.frame_footer = tk.Frame(self, background='yellow', width=600, height=50)
            self.frame_footer.grid(column=0, row=3 , columnspan= 10)
    
    
    
        def show_page(self, page_name):
            """
                let us use the NAME of the class to display(the function show_frame
                use directly the class).
                when we use the classe name, we can put our classes in defferent
                files
            """
            for F in self.frames:
                if F.__name__ == page_name:
                    self.show_frame(F)
                    return
            print(ERROR_404)
    
    
        def show_frame(self, cont):
            """raise to the front the frame we want
    
                :param cont: the frame
            """
            frame = self.frames[cont]
            frame.tkraise()
    
    
    
    class HomePage(tk.Frame):
    
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
    
            #button1 select
            tk.Label(self, text="Select:").grid(column=0, row=2, stick='W')
            self.button1 = tk.Button(self, text="Select")
            self.button1.grid(row=2, column=5, stick='W', padx=(50,0))
            #button1 select
            tk.Label(self, text="Select:").grid(column=0, row=3, stick='W')
            self.button2 = tk.Button(self, text="Select")
            self.button2.grid(row=4, column=5, stick='W', padx=(50,0))
            #button submit
            self.submit = tk.Button(self, text="Start")
            self.submit.grid(row=10, column=9, stick='W')
    
    
    class StartPage(tk.Frame):
    
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
    
            label = tk.Label(self, text="""ALPHA application.
            use at your own risk. There is no promise
            of warranty""", font=LARGE_FONT)
            label.pack(pady=10, padx=10)
    
            button1 = ttk.Button(self, text="Agree",
                                command=lambda: controller.show_page("HomePage"))
            button1.pack()
    
            button2 = ttk.Button(self, text="Disagree",
                                command=controller.destroy)
            button2.pack()
    
    
    
    if __name__ == "__main__":
        sjabloon = sjabloon()
        sjabloon.mainloop()
    

    【讨论】:

    • 之后,你基本上可以通过在需要时添加一些页面来构建任何不太复杂的东西。您可以将按钮导航到页眉中的页面,(每个按钮执行回调show_Page)
    • 你做得很好,我会试着拿一些东西来玩。在第一堂课中你设置了 class sjabloon(tk.Tk):你为什么在那里使用那个 tk.Tk?你对 HomePage 类做同样的事情
    • @Sébastien S. 忘记了我上一篇文章中的内容,非常感谢你,很抱歉回复晚了。你能解释一下你使用的“控制器”变量吗?您在类起始页错误中的 button1 中调用它,我不明白它指的是什么。 ,你在init中使用它,但我不明白为什么。
    • 很高兴它有帮助! 1. 你创建了一个 tkinter 窗口类,所以你应该从类 tkinter 窗口(类 Tk)继承你的类。你不应该像在你的 sjabloon 的构造函数中那样在你的类中创建一个 tkinter 窗口的实例(顺便说一句,我当时没有看到它,但这是一个将类名的第一个字母大写的标准,你真的应该这样做)
    • 2.控制器 var 表示主窗口(Sjlabloon)。当我实例化一个页面时,我输入了 2 个参数,即我的页面所在的框架和主窗口。真的很有用,比如切换页面,我的所有页面都可以使用Sjabloon的公共方法“show_page”。我称它为控制器,因为它在教程中是这样调用的(我个人称它为“主视图”或类似的东西)
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2018-06-28
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2015-07-13
    • 2017-01-27
    • 2015-06-16
    相关资源
    最近更新 更多