【问题标题】:tkinter gui formatting menu's with frames (pyhon2.7)带有框架的 tkinter gui 格式化菜单(python2.7)
【发布时间】:2015-06-05 15:58:30
【问题描述】:

我目前是一名正在上初级编程课程的高中生。我们刚刚开始了一个新的单元学习 Python 中的 Tkinter,我对我们的一个项目有几个问题。我决定做一个制作货币转换器的项目。我完成了有关 api 的所有内容,现在我在制作我的 gui 时遇到了障碍。我在将按钮移动到所需位置时遇到问题。目前我的按钮卡在中间,如果我更改行和列,它会移动到随机位置并破坏白色背景。任何帮助将不胜感激!

非常感谢。

import Tkinter as tk
import tkMessageBox

CURRENCY_CODES = ('USD','GDP')

class Application(tk.Frame):
    def __init__(self, parent = None):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.setupUI()
        self.createWidgets()

    def setupUI(self):
        self.parent.title("User Input")
        self.grid()
        self.centerWindow()

    def centerWindow(self):
        app_width = 307
        app_height = 350

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        x = (sw - app_width)/2
        y = (sh - app_height)/2
        self.parent.geometry('%dx%d+%d+%d' % (app_width, app_height, x, y))

    def createWidgets(self):
        self.emptyFrame = tk.Frame(self.parent,bg="white")
        self.emptyFrame.grid(row=0,column=0,sticky="news")
        self.parent.grid_columnconfigure(0,weight=1)
        self.parent.grid_rowconfigure(0,weight=1)

【问题讨论】:

  • 你的OptionMenu(不是Button)是self.parent的一个孩子,所以grid()在第0行/第0列把它放在self.emptyFrame上面设置到同一个位置。如果您在其他地方grid() 它,它将在self.parent 的自己的行/列中,它没有像self.emptyFrame 那样的白色背景。您可以使菜单小部件成为框架的子项,然后使用sticky 在框架周围移动它。如果您希望它位于任意位置,请按照答案中的建议使用place()
  • 您的代码没有显示按钮。当你不包含实际代码时,很难看出你做错了什么。
  • 您的标题询问的是带有框架的菜单格式,但您的问题是有关在窗口中组织按钮的问题。请将您的标题更改为与实际询问的内容相关的内容。

标签: python python-2.7 tkinter


【解决方案1】:

您可以使用 'x' 和 'y' 坐标将它放在任何你喜欢的位置,

        self.currencyMenu.place(x = 10, y = 250) 

【讨论】:

  • 因为小部件的绝对位置很难管理。你必须自己做所有的数学运算。如果您添加另一个小部件,或决定更改主小部件的大小,则必须返回并摆弄每个小部件的位置。另外,如果代码以不同的分辨率或不同的字体运行,则可能无法正确排列。如果用户调整窗口大小,他们也可能无法正确对齐(并且您应该始终允许用户调整窗口大小)。 gridpack 解决所有这些问题。
【解决方案2】:

您的问题没有显示完整的程序,也没有显示任何按钮,因此不可能告诉您所有问题。但是,您所做的一些事情肯定会导致您走上错误的道路。

第一个问题是这样的:

self.grid()

作为一般规则,创建小部件的函数是应该使用几何管理器添加小部件的函数。无论您在哪里打电话,Application() 都应该负责将框架放入其容器中。

app = Application(root)
app.grid(...)

第二,是这行代码吗:

self.emptyFrame = tk.Frame(self.parent,bg="white")

框架或根窗口的子窗口(@98​​7654325@ 就是这样)永远不应将小部件放在其自身之外。 Application 内的所有内容都应该在 Application 内。否则就不可能兼顾所有几何管理。那个空框架需要在Application 内(例如:self):

self.emptyFrame = tk.Frame(self, bg="white")

如果您有一个从其他小部件类继承的类,它应该只会影响自己并且它是子类1。它不应该做任何影响其父级的事情。如果你坚持这个原则,小部件布局就会变得非常、非常、非常容易。

1 我知道网上有很多违反这个原则的例子,但他们都做错了。虽然对于琐碎的应用程序或多或少没问题,但对于复杂的应用程序,它很快就会成为一个相当大的负担。如果你在简单的应用程序上练习正确的编码,那么当你毕业到更复杂的应用程序时,你就不必改变你的技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2021-09-18
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多