在 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】:

如果您想调整ToplevelTk 实例的大小,可以对对象使用几何方法:

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 的大小,您可以简单地设置其widthheight 选项:

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 中更改框架的大小,由一个类定义的主要内容,如果未能解决你的问题,请参考以下文章

动态更改按钮在 tkinter 中调用的命令的问题

更改字体大小而不弄乱 Tkinter 按钮大小

从类外部更改Tkinter标签

调整tkinter窗口和内容的大小

如何更改标签小部件中的文本大小,python tkinter [重复]

如何更改文本框的大小,以便它可以使用tkinter和python在UI上水平扩展