【发布时间】: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()可以在这里工作。 -
如何定义“居中”?垂直居中?横向?两者都有?