这稍微暴露了我正在构建的整个程序,但它仍然只是前端。如果你们想自己制作应用程序,请继续。 :P
所以,正如标题所说,我正在尝试制作一个包含一个包含网格的框架的网格,我已经看了几个类似的问题并且没有完全得到答案,可能是因为我是guis和tkinter的新手,解决方案通常适合他们的特定计划。所以这是一个适合我的类似问题。
我要做的是构建具有如下整体框架结构的东西:GUI Frame structure,其中除了ioFrame之外的每个框架都是2x2网格。 ioFrame包含两个内容:输入行和输出行。简而言之,这是一个计算逻辑输入的计算器,你唯一的“数字”是真的和假的。
这是我的代码atm:
from PIL import Image
def cv2glet(img):
'''Assumes image is in BGR color space. Returns a pyimg object'''
rows, cols, channels = img.shape
raw_img = Image.fromarray(img).tobytes()
top_to_bottom_flag = -1
bytes_per_row = channels*cols
pyimg = pyglet.image.ImageData(width=cols,
height=rows,
format='BGR',
data=raw_img,
pitch=top_to_bottom_flag*bytes_per_row)
return pyimg
我仍然需要将命令添加到这些命令(我已经在一个单独的文件中编写),但我现在只是想单独完成gui。
我的问题是,我的代码输出了这个结果:Current GUI。这显然与我的目标背道而驰。对此我不熟悉,我可能会列出一系列问题。
任何帮助都将不胜感激。
答案 0 :(得分:0)
我将在这里假设你因为所有的分号而从另一种语言来到python。在python中,你不需要SEMICOLONS 。如果确实希望将这些变量全部放在一行上,我会在顶部理解,但脚本中的每一行都不应以分号结尾。
其次,如果您打印出放入变量的任何按钮的值,您将看到它是None
而不是tkinter.Button
对象。这是因为该行末尾的.grid(...)
调用(grid
返回None
)。通常情况下,如果我打算稍后在应用程序中使用它,我只会将小部件放入变量中。如果没有,我会对标签执行操作,只需在标签前面调用some_variable_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=)
您的按钮变量也有拼写错误。在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')
更改文本)。完成所有更改后,这是我的输出: