【问题标题】:Can't center butttons using .grid tkinter无法使用 .grid tkinter 居中按钮
【发布时间】:2021-01-28 14:03:21
【问题描述】:

我正在尝试在 Python 中使用 tkinter 构建简单的 GUI。在“主页”页面上,我需要将按钮居中,但我不知道该怎么做。我不想使用地点,因为我想学习如何正确使用网格系统。 这是我到目前为止的代码:

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

这就是looks

我还制作了列表 tasks[] 中的所有类,但我没有包括它们,因为它们是空的。

【问题讨论】:

  • 这可能是因为Home 的放置方式。我认为您无法控制这里。但如果你有,请尝试使用pack()
  • 我们无法运行您发布的代码,因为 Zad1、Zad2、Zad3、Zad4、Zad5、Zad6 和 Zad7 都未定义。请向我们提供一个minimal reproducible example,它将运行。
  • @CoolCloud:OP 可以控制所有内容的放置方式。
  • @BryanOakley 然后我认为在Home 的实例化上使用pack() 可以在这里工作。
  • 如何定义“居中”?垂直居中?横向?两者都有?

标签: python tkinter grid


【解决方案1】:

我制作的模组标有# (*** 1 ***), # (*** 2 ***)等。 一共有5个。 我没有足够的声誉来发布图片。 无论如何,这是一个链接到它的外观: 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()

【讨论】:

    【解决方案2】:

    假设你想使用网格,试试这个:

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

    如果此答案有帮助,请点赞并标记为正确。欣赏!

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 2019-11-17
      • 2018-09-13
      • 1970-01-01
      • 2016-09-28
      • 2016-02-20
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多