简体   繁体   English

无法使用 .grid 使按钮居中 tkinter

[英]Can't center butttons using .grid tkinter

I am trying to build simple GUI using tkinter in Python. On the page "Home" I need my buttons to be centered, but I can't figure out how to do that.我正在尝试使用 Python 中的 tkinter 构建简单的 GUI。在“主页”页面上,我需要将按钮居中,但我不知道该怎么做。 I don't want to use place, cause I want to learn how to use grid system properly.我不想使用 place,因为我想学习如何正确使用网格系统。 This is the code I have so far:这是我到目前为止的代码:

import tkinter as tk


class Main(tk.Tk):
    def __init__(self, *args, **kwargs):

        tasks = [Home, Zad1, Zad2, Zad3, Zad4, Zad5, Zad6, Zad7]

        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)
        container.grid(column=0, row=0)
        # container.grid_rowconfigure(0, weight=1)
        # container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for shown in tasks:
            shown_name = shown.__name__
            frame = shown(parent=container, controller=self)
            self.frames[shown_name] = frame
            frame.grid(row='0', column='0',sticky='snew')

        self.show_frame('Home')

    def show_frame(self, shown_name):
        frame = self.frames[shown_name]
        frame.tkraise()


class Home(tk.Frame):
    def __init__(self, parent ,controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        self.buttons()

    def buttons(self):
        tasks = [Zad1, Zad2, Zad3, Zad4, Zad5, Zad6, Zad7]
        i = 1
        r = 0
        for page in tasks:
            page_name = page.__name__
            button = tk.Button(self,
                text=i, width=10,
                command=lambda page_name=page_name:
                self.controller.show_frame(page_name)).grid(row=r,column=0,pady=15)
            i+=1
            r+=1



class Zad1(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        text = tk.IntVar()
        label = tk.Label(self, text="brutto:")
        brutto_input = tk.Entry(self, textvariable=text)
        show = tk.Button(self, text="Show",width=10, command=lambda: self.netto(text))
        home = tk.Button(self, text="Home",width=10, command=lambda: controller.show_frame('Home'))
        label.grid(row=0,column=0)
        brutto_input.grid(row=0,column=1)
        show.grid(row=0,column=2)
        home.grid(row=1,column=2)

    def netto(self, text):
        self.text = text
        text_get = text.get()
        netto_output = tk.Label(self, height=2, width=15, text=f'Sum: {text_get+1}')
        netto_output.grid(row=0,column=3)
        netto_output.config(text=f'Sum: {text_get+1}')



class Zad2(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="2:")

class Zad3(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="3:")


class Zad4(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="4:")


class Zad5(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="5:")


class Zad6(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="6:")


class Zad7(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="8:")


if __name__ == "__main__":
    app = Main()
    app.title('Last Test')
    app.geometry('500x500')
    app.mainloop()

And here is how it looks这是它的样子

I also have all classes from the list tasks[] made, but I didn't include them, couse they are empty.我也有列表任务 [] 中的所有类,但我没有包括它们,因为它们是空的。

The mods I made are marked with # (*** 1 ***), # (*** 2 ***) , etc. There are 5 in total.我做的mod标有# (*** 1 ***), # (*** 2 ***)等,一共有5个。 I don't have enough reputation to post images.我没有足够的声誉来发布图片。 Anyway, here is a link to how it looked: https://i.postimg.cc/DzHy1S5t/cant-center-butttons-using-grid-tkinter.png不管怎样,这里有一个链接: https://i.postimg.cc/DzHy1S5t/cant-center-butttons-using-grid-tkinter.png

import tkinter as tk


class Main(tk.Tk):
    def __init__(self, *args, **kwargs):

        tasks = [Home, Zad1, Zad2, Zad3, Zad4, Zad5, Zad6, Zad7]

        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)    
        #container.pack(side='top', fill='both', expand=True) # (*** 1 ***) this line was commented out
        container.grid(column=0, row=0)
        # container.grid_rowconfigure(0, weight=1)
        # container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for shown in tasks:
            shown_name = shown.__name__
            frame = shown(parent=container, controller=self)
            self.frames[shown_name] = frame
            frame.grid(row='0', column='0',sticky='snew')

        self.rowconfigure(0, weight=1)      # (*** 2 ***) this line was added
        self.columnconfigure(0, weight=1)   # (*** 3 ***) this line was added

        self.show_frame('Home')

    def show_frame(self, shown_name):
        frame = self.frames[shown_name]
        frame.tkraise()


class Home(tk.Frame):
    def __init__(self, parent ,controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        self.buttons()

    def buttons(self):
        tasks = [Zad1, Zad2, Zad3, Zad4, Zad5, Zad6, Zad7]
        i = 1
        r = 0
        for page in tasks:
            page_name = page.__name__
            button = tk.Button(self,
                text=i, width=10,
                command=lambda page_name=page_name:
                self.controller.show_frame(page_name)).grid(row=r,column=0,pady=5)
            self.rowconfigure(r, weight=1)  # (*** 4 ***) this line was added
            i+=1
            r+=1
        self.columnconfigure(0, weight=1)   # (*** 5 ***) this line was added



class Zad1(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        text = tk.IntVar()
        label = tk.Label(self, text="brutto:")
        brutto_input = tk.Entry(self, textvariable=text)
        show = tk.Button(self, text="Show",width=10, command=lambda: self.netto(text))
        home = tk.Button(self, text="Home",width=10, command=lambda: controller.show_frame('Home'))
        label.grid(row=0,column=0)
        brutto_input.grid(row=0,column=1)
        show.grid(row=0,column=2)
        home.grid(row=1,column=2)

    def netto(self, text):
        self.text = text
        text_get = text.get()
        netto_output = tk.Label(self, height=2, width=15, text=f'Sum: {text_get+1}')
        netto_output.grid(row=0,column=3)
        netto_output.config(text=f'Sum: {text_get+1}')



class Zad2(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="2:")

class Zad3(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="3:")


class Zad4(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="4:")


class Zad5(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="5:")


class Zad6(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="6:")


class Zad7(tk.Frame):
    def __init__(self, parent, controller, **kw):
        super().__init__(**kw)
        self.controller = controller
        label = tk.Label(self, text="8:")


if __name__ == "__main__":
    app = Main()
    app.title('Last Test')
    app.geometry('500x500')
    app.mainloop()

Assuming you want to use grid, try this:假设你想使用网格,试试这个:

button.grid(row = 1, col = 0)

If this answer helped, kindly upvote and mark as correct.如果此答案有帮助,请点赞并标记为正确。 Appreciate it!欣赏它!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM