当画布被网格化时,Python Tkinter画布形状不会显示,但是在打包时会显示吗?

时间:2014-07-21 22:34:29

标签: python tkinter

第一次使用stackexchange 所以我从一个月前开始自学编程,并且很慢。 我遇到了很多问题,因为我一直在努力,只是在网上随机搜索,甚至没有看过任何书籍或任何东西,通过自我学习和尝试建立"项目" (这花了很多时间做一些简单的事情。)

无论如何,我遇到了很多问题,我最终解决了这些问题,占用了大量的时间。我绕过的一些问题,不知道出了什么问题,只是记住那个地区的某些事情确实出错了。

那么,我已经决定了我能解决的任何问题,我可以在这里问一下。所以这是一个简单的问题,我无法理解:

from Tkinter import *

root = Tk()
backgroundCanvas = Canvas(root)
backgroundCanvas.grid(row = 0, column = 0, sticky = N+S+E+W)
#backgroundCanvas.pack(fill = BOTH, expand = True)

margin= 20
padding = 10
cellWidth = 100
cellHeight = 130

xypos = [ ]
xdif = cellWidth + 2*padding
ydif = cellHeight + 2*padding
for i in range(4):
    for j in range(4):
        a = margin+padding+i*xdif
        b = margin+j*ydif
        xypos.append((a,b,a+cellWidth,b+cellHeight))
for xpos1,ypos1,xpos2,ypos2 in xypos:
    backgroundCanvas.create_rectangle((xpos1,ypos1),(xpos2,ypos2), fill = "blue")
    print xpos1,ypos1,xpos2,ypos2

root.mainloop()

很抱歉没有包含图片,但是如果我对它进行网格化,它只会在"第一个"上创建3个完整的矩形。行,然后在"第二"上的另外三个切割矩形。行(不是行网格,只是一个块,第0行,第0列)。但是,如果我打包它,它会正确显示,显示所有16个矩形。

提前感谢您花时间阅读本文,我知道它有点不清楚!

编辑:另一个问题(我知道我应该在另一个帖子上询问,但它在规模上是一个较小的问题),说我有四个画布,他们的父母是根。他们的名字如下:

firstCanvas = Canvas(root)
secondCanvas = Canvas(root)
thirdCanvas = Canvas(root)
fourthCanvas = Canvas(root)

并说我已经打包/网格化了所有或诸如此类的东西。现在我想将鼠标点击它们中的每一个。我做: firstCanvas.bind("",mousePressed) fourthCanvas.bind("",mousePressed)

等等......但是,如果我有10幅画布,我是否必须手动粘贴其中10幅画布?我可以创建一个整齐地绑定它们的循环吗?这里的问题是我不能说数字+ Canvas.bind ...等[第一,第二,第三......]中的数字,因为它不会像那样工作。很多不确定的东西,更不用说它只是不起作用。

使用字符串来解决它并不起作用,因为firstCanvas不是一个字符串,它实际上是一个"变量"指着画布。

我做过很多次的解决方法是创建一个字典,在那里他们使用可以变量的字符串。例如,对于[first,...]中的数字,canvas_data ["%d" %(数字)+画布] = do_your_thing_here,这是有效的,但它不是很优雅。

更不用说我甚至不确定在tkinter中使用分配给实际Canvas的字典变量实际上是否有效(没有尝试过)。如果确实如此,那我就可以做到......说 canvas_data [firstCanvas] .bind("",mousePressed)。

但这不是重点,我正在寻找另一种方法来做到这一点,无论如何改变"不是字符串的字符?

另一种方式,我有变量名为variableA,variableB,variableC 我想做(2个例子):

    for letter in [A,B,C]:
        variable+letter = letter

    varA = 1, varB = 2, varC = 3
    for letter in [A,B,C]: 
        print var+letter.

我希望我足够清楚......对此事的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

代替名称firstCanvassecondCanvas使用列表和数字。

canvases = []

for x in range(10):
    canvases.append( Canvas(root) )

通过这种方式,您可以创建任意数量的画布,然后将其用作

canvases[0]
canvases[1]
etc.

然后你可以绑定到所有画布

for c in canvases:
    c.bind(...)

或者您可以立即执行此操作

canvases = []

for x in range(10):
    c = Canvas(root)
    c.bind(...)
    canvases.append( c )

取代variableAvariableBvariableC使用字典

variables = {}

for letter in 'ABC':
    variables[letter] = letter

variables = {'A': 1, 'B': 2, 'C': 3}

for letter in 'ABC': 
    print varaibles[letter]

至于第一个/主要问题 - 在调整窗口大小时,通常网格不会改变单元格大小。

因此单元格保持大小(它获得窗口的大小),你只看到画布的一部分。如果您将设置窗口大小(或者您将设置画布大小),您将看到更多的矩形。

但是,您可以在调整窗口大小时更改grid行为以调整行或列的大小。

backgroundCanvas.grid(row = 0, column = 0, sticky = N+S+E+W)
root.grid_rowconfigure(0, weight=1) # resize row 0 vertically
root.grid_columnconfigure(0, weight=1) # resize column 0 horizontally

顺便说一句:使用backgroundCanvas.pack() - 没有奖励 - 你也只得到部分矩形。


TkinterbookThe Tkinter Grid Geometry ManagerThe Tkinter Pack Geometry Manager