[英]Can't center butttons using .grid tkinter
我正在尝试使用 Python 中的 tkinter 构建简单的 GUI。在“主页”页面上,我需要将按钮居中,但我不知道该怎么做。 我不想使用 place,因为我想学习如何正确使用网格系统。 这是我到目前为止的代码:
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()
这是它的样子
我也有列表任务 [] 中的所有类,但我没有包括它们,因为它们是空的。
我做的mod标有# (*** 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()
假设你想使用网格,试试这个:
button.grid(row = 1, col = 0)
如果此答案有帮助,请点赞并标记为正确。 欣赏它!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.