【问题标题】:Tkinter: Grid containing frame containing gridTkinter:包含网格的网格
【发布时间】:2017-07-10 02:23:53
【问题描述】:

这稍微暴露了我正在构建的整个程序,但无论如何它只是前端。如果你们想自己制作应用程序,请继续。 :P

所以,正如标题所说,我正在尝试制作一个包含一个包含网格的框架的网格,并且我查看了一些类似的问题并没有完全得到答案,可能是因为我guis 和 tkinter 的新手,解决方案通常适合他们的特定程序。所以这里有一个适合我的类似问题。

我正在尝试使用如下所示的整体框架结构构建一些东西:GUI Frame structure,其中除了 ioFrame 之外的每个框架都是 2x2 网格。 ioFrame 包含两件事:输入行和输出行。简而言之,这是一个计算逻辑输入的计算器,你唯一的“数字”是真假。

这是我的自动取款机代码:

from tkinter import *; 


class calculator:

    #def update(self, 

    def __init__(self, window):
        """
        Constructor method.
        """

        self.toCompute = []; self.In = StringVar(); self.Out = StringVar();

        # Window title
        window.title("Logic Calculator");

        # The set of 5 frames.
        ioFrame = Frame(window, relief=GROOVE, borderwidth=3); ioFrame.grid(row=0); ioFrame.pack();
        nwFrame = Frame(window); nwFrame.grid(row=1,column=0); nwFrame.pack();
        neFrame = Frame(window); neFrame.grid(row=1,column=1); neFrame.pack();
        swFrame = Frame(window); swFrame.grid(row=2,column=0); swFrame.pack();
        seFrame = Frame(window); seFrame.grid(row=2,column=1); seFrame.pack();

        # Top 2 rows: the IO portion
        Label(ioFrame, textvariable=self.In, relief=SUNKEN).grid(row=0, sticky=W);
        Label(ioFrame, textvariable=self.Out).grid(row=1, sticky=E);

        # Top left 2x2 Frame: [ ( | ) ][ T | F ]
        brlButton = Button(nwFrame, text='(', height=2, width=10).grid(row=0,column=0);
        brrButton = Button(nwFrame, text=')', height=2, width=10).grid(row=0,column=1);
        truButton = Button(nwFrame, text='T', height=2, width=10).grid(row=1,column=0);
        falButton = Button(nwFrame, text='F', height=2, width=10).grid(row=1,column=1);

        # Top right 2x2 Frame: [ AND | OOR ][ NND | NOR ]
        andButton = Button(neFrame, text='and', height=2, width=10).grid(row=0,column=0);
        oorButton = Button(neFrame, text='oor', height=2, width=10).grid(row=0,column=1);
        nndButton = Button(neFrame, text='nnd', height=2, width=10).grid(row=1,column=0);
        norButton = Button(neFrame, text='nor', height=2, width=10).grid(row=1,column=1);

        # Bottom left 2x2 Frame: [ SSO | IIF ][ NSO | NIF ]
        andButton = Button(swFrame, text='sso', height=2, width=10).grid(row=0,column=0);
        oorButton = Button(swFrame, text='iif', height=2, width=10).grid(row=0,column=1);
        nndButton = Button(swFrame, text='nso', height=2, width=10).grid(row=1,column=0);
        norButton = Button(swFrame, text='nif', height=2, width=10).grid(row=1,column=1);

        # Bottom right 2x2 Frame:[ EEQ | NEG ][ NEQ | === ]
        eeqButton = Button(seFrame, text='eeq', height=2, width=10).grid(row=0,column=0);
        negButton = Button(seFrame, text='neg', height=2, width=10).grid(row=0,column=1);
        neqButton = Button(seFrame, text='neq', height=2, width=10).grid(row=1,column=0);
        comButton = Button(seFrame, text='=', height=2, width=10).grid(row=1,column=1);



if __name__ == "__main__": # Only runs program if this specfic file is opened.

    window = Tk(); # The window
    calculator(window);
    window.mainloop();

我仍然需要将命令添加到这些命令中(我已经在单独的文件中编写了这些命令),但我现在只是试图单独完成 gui。

我的问题是我的代码输出了这个结果:Current GUI。这显然与我的目标相去甚远。作为新手,我可能有一系列问题。

任何帮助将不胜感激。

【问题讨论】:

  • 你用的是什么版本的python?我正在使用 python3,提供的代码甚至没有运行
  • @Nelson 你是怎么知道的?您是否知道错误是什么或在哪里?
  • @Nelson 版本 3.3.2。
  • 我即将发布答案。

标签: python user-interface tkinter logic calculator


【解决方案1】:

我在这里假设您是从另一种语言开始使用 python 的,因为所有的分号。在 python 中,你不需要分号。如果您真的希望将这些变量全部保留在一行中,我最了解的是,但脚本中的每一行不应以分号结尾。

其次,如果您打印出您放入变量中的任何按钮的值,您将看到它是None,而不是tkinter.Button 对象。这是因为在行尾调用了.grid(...)grid 返回None)。通常,如果我打算稍后在应用程序中使用它,我只会将小部件放入变量中。如果没有,我会按照您对标签所做的操作,只是在前面没有 some_variable_name = 的情况下调用它们。如果您稍后尝试对这些按钮变量执行任何操作,它将无法正常工作,因为它们都是 None

正如 cmets 中所述,我无法让您提供的代码运行,因为您正在使用 .grid(...) .pack(...) 将框架放置在窗口上。你只需要一个。这实际上是导致我错误的原因。将窗口或框架视为容器;如果您使用grid 将某些东西放入该容器中,那么您不能使用pack 将其他东西放入该容器中。放置小部件的不同方法相互冲突。我相信你得到的输出是因为它会使用 grid 放置框架,然后使用 pack 重新放置它们,这就是它们垂直对齐的原因。


所以考虑到所有这些,这就是我所拥有的:

########## Frames ##########

# this is what the frames should look like in your code
frame = Frame(window, ...)
frame.grid(row=, column=)



########## Buttons ##########

# if you want to keep the buttons in variables
btn = Button(parent, text='', width=, height=)
btn.grid(row=, column=)

# or

# if the buttons don't have to be in variables, like your Labels
Button(parent, text='', width=, height=).grid(row=, column=)

您的按钮变量也有错字。在Bottom left 2x2 Frame 部分中,应更改按钮变量名称以匹配部分标题(如果您保留变量名称):

ssoButton = ...
iifButton = ...
nsoButton = ...
nifButton = ...

按钮变量只是对 Button 对象的引用,因此重用名称并不重要,除非您想稍后在代码中使用按钮。在那种情况下,它会引起问题,就像我之前说的那样。

我更新了部分代码,以便您看到它的样子:

编辑:我差点忘了 ioFrame。它应该被允许扩展以填充顶部提供的空间,但事实并非如此。要解决这个问题:

ioFrame = Frame(window, relief=GROOVE, borderwidth=3, bg='green')
ioFrame.grid(row=0, columnspan=2, sticky=N+E+S+W)

我将背景设置为绿色只是为了确保它填充空间,并将 StringVars 设置为一些虚拟文本以进行测试(这样做:self.In.set('text here') 以更改文本)。完成所有更改后,这是我的输出:

【讨论】:

  • 谢谢!关于分号,我不需要它们。只是我想与其他语言的代码保持一致。 Python 实际上是我学习的第一个。
  • @OsamaKawish 欢迎您。这实际上很有趣。只是想确保你知道:)
猜你喜欢
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2018-08-29
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多