在 tkinter 中更改框架的大小,由一个类定义
Posted
技术标签:
【中文标题】在 tkinter 中更改框架的大小,由一个类定义【英文标题】:Change size of frame in tkinter, which is defined by a class 【发布时间】:2018-08-07 14:24:12 【问题描述】:我正在尝试更改 tkinter 中帧的大小;我正在使用 python 3.0,并且正在为学校项目创建库存管理类型的东西。这是我现在拥有的代码,我正在尝试编辑框架的尺寸。我试图在网上查找,但没有找到我需要的信息。我知道您需要使用:
.geomtry()
内置函数,但我不知道把它放在哪里,或者如何将它与类一起使用。
import tkinter as tk
LARGE_FONT= ("Comic Sans MS", 12)
SMALL_FONT=('Comic sans ms', 8)
class StockManager(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames =
for F in (StartPage, PageOne):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
lbl1 = tk.Label(self, text='Welcome to the stock manager', font=LARGE_FONT)
lbl1.pack(pady=10, padx=10)
lbl2 = tk.Label(self, text='What would you like to do?', font=LARGE_FONT)
lbl2.pack(pady=10, padx=10)
btnShowProducts = tk.Button(self, text='1. Show all products ', font=LARGE_FONT,)
btnShowProducts.pack(anchor='w')
btnSearchProducts = tk.Button(self, text='2. Search for a product ', font=LARGE_FONT)
btnSearchProducts.pack(anchor='w')
btnAddProduct = tk.Button(self, text='3. Add another product ', font=LARGE_FONT)
btnAddProduct.pack(anchor='w')
btnDeleteProduct = tk.Button(self, text='4. Delete a product ', font=LARGE_FONT)
btnClose = tk.Button(self, text='Close Database ', font=LARGE_FONT)
btnClose.pack(anchor='w')
btnNextPage = tk.Button(self, text='Next Page', font=SMALL_FONT)
btnNextPage.pack(anchor='s')
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One!!!", font=LARGE_FONT)
label.pack(pady=10, padx=10)
btnAddTrans = tk.Button(self, text='1. Add a new transaction', font=('comic sans ms', 10)) ##CREATE ADD TRANSACTION HERE
btnShowTrans = tk.Button(self, text='2. Show Transactions', font=('Comic Sans MS', 10))
btnShowTrans.pack(anchor='w')
button1 = tk.Button(self, text="Back to Home")
button1.pack()
button2 = tk.Button(self, text="Next Page")
button2.pack()
menu = StockManager()
menu.mainloop()
【问题讨论】:
你确定你的意思是框架和不是顶层或Tk窗口? 对不起,我认为 tk.Frame 是它自己的窗口,我的意思是当我运行程序时,会出现一个带有以下按钮和标签等的屏幕,我想增加大小无需拖动角落,并通过编码,我希望它可以清除它。 请提供一个可行的例子。目前,如果我要复制粘贴您的代码,它将无法运行。 @Mike-SMT 我现在将使用一些您可以运行的代码来编辑问题。道歉 @Mike-SMT 编辑兄弟 【参考方案1】:这里有一个简单的例子,说明如何使用geometry()
方法调整窗口大小。这应该有助于您了解它在类中的工作原理。
import tkinter as tk
class My_App(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
# we need to set parent as a class attribute for later use
self.parent = parent
button1 = tk.Button(self.parent, text="Make window larger!", command = self.make_window_bigger)
button1.pack()
button2 = tk.Button(self.parent, text="Make window Smaller!", command = self.make_window_smaller)
button2.pack()
def make_window_bigger(self):
x = self.parent.winfo_height() + 10
y = self.parent.winfo_width() + 10
self.parent.geometry('x'.format(y, x))
def make_window_smaller(self):
x = self.parent.winfo_height() - 10
y = self.parent.winfo_width() - 10
self.parent.geometry('x'.format(y, x))
root = tk.Tk()
My_App(root)
root.mainloop()
【讨论】:
所以如果我要在类中设置尺寸,一种方法是简单地做 self.parent=parent self.parent.geometry(x,y) 不完全。您需要将其格式化为字符串,因为几何将其作为字符串格式。你需要这样做。('x'.format(y, x)
。话虽如此,另一部分是正确的。您只需将父级定义为类属性并像我展示的那样使用几何图形。
@bobdaves69 没问题。当你测试它时告诉我它是怎么回事。【参考方案2】:
如果您想调整Toplevel
或Tk
实例的大小,可以对对象使用几何方法:
root.geometry("x++".format(16, 32, 64, 128))
#self.geometry("x++".format(16, 32, 64, 128))
#self.winfo_toplevel().geometry()("x++".format(16, 32, 64, 128))
如果您的意思是如何调整Frame
的大小,您可以简单地设置其width
和height
选项:
frame = tk.Frame(root, bg='red', width=32, height=23)
#self.config(bg='red', width=32, height=23)
如果框架非空,您还应取消设置其传播,以禁止根据其子小部件的大小要求调整大小,请根据子小部件使用的几何管理器进行调整:
frame.pack_propagate(False) # discard either in accordance with the children
frame.grid_propagate(False)
#self.pack_propagate(False) # discard either in accordance with the children
#self.grid_propagate(False)
【讨论】:
你的回答有点不清楚。如果框架非空,如果要在框架本身上指定宽度和高度,则将传播设置为 False 不是可选的。我想你知道这一点,但你的回答并没有说清楚。 @BryanOakley 感谢您的帮助,我认为现在更清楚了。最初,我认为如果要销毁里面的小部件,它会调整到给定的大小,但这似乎是错误的。应该在小部件达到他们希望的大小后准确地取消设置传播。以上是关于在 tkinter 中更改框架的大小,由一个类定义的主要内容,如果未能解决你的问题,请参考以下文章