python - 无法使用 .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()
这就是它的外观
我还制作了列表 tasks[] 中的所有类,但我没有包括它们,因为它们是空的。
解决方案
我制作的模组都标有# (*** 1 ***), # (*** 2 ***)
等,一共5个。我没有足够的声誉来发布图片。无论如何,这里是它的外观链接:
https ://i.postimg.cc/DzHy1S5t/cant-center-buttons-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()
推荐阅读
- javascript - 为什么我的倍数函数返回 NaN?
- python - 乘客应用程序错误:内部错误
- javascript - 如何访问护照中的整个用户对象
- javascript - 如何将 JSON 文件转换为 JS 数组
- google-cloud-firestore - SwiftUI 和 Picker 和 FireStore 返回文档 ID 不落
- flask - url_for 的烧瓶蓝图问题
- wordpress - 触发高级自定义字段 (ACF) 'acf/save_post' 操作
- python - PayPal 是否仍支持通过 HTTP REST API 的活动报告和余额?
- flutter - 项目目录中没有 Podfile | 颤振 - firebase 身份验证
- minecraft - WorldEdit 如何处理画笔?