Python Tkinter:包含包含框架的栅格包含栅格

Python Tkinter:包含包含框架的栅格包含栅格,python,user-interface,tkinter,logic,calculator,Python,User Interface,Tkinter,Logic,Calculator,这稍微暴露了我正在构建的整个程序,但它只是前端。如果你们想自己制作这个应用程序,那就去吧P 因此,正如标题所说,我正在尝试制作一个包含一个包含网格的框架的网格,我看了一些类似的问题,并没有完全得到答案,可能是因为我对GUI和tkinter不熟悉,而且解决方案通常适合于他们的特定程序。所以这里有一个类似的问题适合我 我要做的是用整体框架结构构建一些东西,看起来像这样:,其中除了ioFrame之外的每个框架都是2x2网格。ioFrame包含两个内容:输入行和输出行。简而言之,这是一个计算逻辑输入的计

这稍微暴露了我正在构建的整个程序,但它只是前端。如果你们想自己制作这个应用程序,那就去吧P

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

我要做的是用整体框架结构构建一些东西,看起来像这样:,其中除了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

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


任何帮助都将不胜感激。

我在这里假设您是从另一种语言来到python的,因为所有的分号。在python中,不需要分号。如果你真的想把这些变量都放在一行上,我可以理解,但是脚本中的每一行都不应该以分号结尾

其次,如果您打印出您在变量中输入的任何按钮的值,您将看到它是
None
,而不是
tkinter.button
对象。这是因为行末尾的
.grid(…)
调用(
grid
返回
None
)。通常,如果我打算以后在应用程序中使用小部件,我只会将其放入变量中。如果没有,我会像你对标签做的那样,只调用它们,前面没有
一些变量\u name=
。如果您以后尝试对这些按钮变量执行任何操作,它都不会起作用,因为它们都是
None

如评论中所述,我无法运行您提供的代码,因为您正在使用
.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=)
您的按钮变量也有输入错误。在
左下角2x2 Frame
部分中,应更改按钮变量名称以匹配部分标题(如果保留变量名称):

button变量只是对button对象的引用,因此重用名称并不重要,除非您想在代码的后面使用按钮。在这种情况下,它将导致问题,就像我之前所说的那样

我更新了部分代码,以便您可以看到它的外观:

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

ioFrame = Frame(window, relief=GROOVE, borderwidth=3, bg='green')
ioFrame.grid(row=0, columnspan=2, sticky=N+E+S+W)
我将背景设置为绿色只是为了确保它填充了空间,并将StringVar设置为一些虚拟文本以进行测试(这样做:
self.In.set('text here')
以更改文本)。完成所有更改后,这是我的输出:


您使用的是什么版本的python?我使用的是python3,提供的代码甚至都没有run@Nelson你怎么知道的?你知道错误是什么或在哪里吗?@Nelson版本3.3.2。我将发布一个答案。谢谢!关于分号,我不需要它们。我只是想与其他语言的代码保持一致。Python实际上是我第一次学习。@OsamaKawish不客气。这真的很有趣。只是想确保你知道:)
ioFrame = Frame(window, relief=GROOVE, borderwidth=3, bg='green')
ioFrame.grid(row=0, columnspan=2, sticky=N+E+S+W)