Tkinter:包含包含网格的框架的网格

时间:2017-07-10 02:23:54

标签: python user-interface tkinter logic calculator

这稍微暴露了我正在构建的整个程序,但它仍然只是前端。如果你们想自己制作应用程序,请继续。 :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。这显然与我的目标背道而驰。对此我不熟悉,我可能会列出一系列问题。

任何帮助都将不胜感激。

1 个答案:

答案 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对象的引用,因此重用名称无关紧要,除非您希望稍后在代码中使用这些按钮。在这种情况下,它会引起问题,就像我之前说的那样。

我更新了部分代码,以便您可以看到它应该是什么样子:

Fixed code

编辑:我差点忘了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')更改文本)。完成所有更改后,这是我的输出:

enter image description here