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