Python框架tkinter

时间:2017-07-24 11:21:51

标签: python-3.x tkinter

我遇到了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()

1 个答案:

答案 0 :(得分:1)

我建议您按照tkinter GUI tutorial进行操作,他会制作一款非常棒的应用,即使它不是您想要的,也会对您有所帮助。

在第4部分中,他在tkinter GUI中创建了一个多帧架构。

对于切换"页面",我知道2个选择(我想更多但我不知道它们,我还是初学者)。您可以在窗口/框架内创建所有框架,并将所需的框架抬高到所需的框架(教程第4部分中的那些框架),或者可以销毁窗口小部件" Page 1"在车身框架内并创建小部件" Page 2"在它里面(显然在方法/功能中让你在页面之间切换)。

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

self.button1.grid(row=2, column=5, stick='W', padx=(50,0))
编辑:我为你做了一个小架构(从我在该教程中学到的东西) 基本上,你创建了所有的" Page",你将它们添加到bodyFrame中,然后将你想要的那个添加到前面。为实现这一目标,对于每个" Page",您创建一个继承tk.Frame的类,并在mainWindow中添加该类的实例

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