2014-07-21 21 views
1

第一次在stackexchange上 所以我从一个月前开始自学自编程序,进行得非常慢。 我遇到过很多问题,因为我一直在努力学习它,只是在网上随便学习一遍,甚至没有看到任何书或任何东西,通过自我体验学习并试图构建“项目”(占用这么多时间做简单的事情)。当画布被网格化时,Python Tkinter画布形状不显示,但是在包装时做?

无论如何,我遇到了很多问题,我最终解决了这些问题,占用了很多时间。我绕过了一些问题,不知道出了什么问题,但要牢记在那个领域的某些事情确实出错了。

好了,我已经决定,我无法排序的任何问题,我可以在这里问。所以这里有一个简单的一个,我不能完全围绕让我的头:

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) 

并说我已经打包/网格化他们所有或whatnot。现在我想将我的鼠标移到每个人身上。我做的: firstCanvas.bind( “” 的mousePressed) fourthCanvas.bind( “” 的mousePressed)

等等,但如果我有10个画布,将我必须手动粘贴该行10他们?我可以创建一个将它们整齐地绑定在一起的循环吗?这里的问题是,我不能在[first,second,third ...]中为数字说数字+ Canvas.bind ...等,因为它不能像那样工作。未定义的许多事情不说,它只是不起作用。

使用字符串绕过它不起作用,因为firstCanvas不是字符串,它实际上是一个指向画布的“变量”。

我做了很多次的解决方法是创建一个字典,他们在那里使用可以是变量的字符串。例如,对于[first,...]中的数字,canvas_data [“%d”%(number)+ Canvas] = 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

代替名称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 

BTW:使用backgroundCanvas.pack() - 没有aguments - 你只能得到矩形的一部分了。


TkinterbookThe Tkinter Grid Geometry ManagerThe Tkinter Pack Geometry Manager

+0

我明白了!感谢您提供字典命名技巧,这非常整齐。至于网格,我实际上忘记了加重列,但即使在我做了之后,它也不起作用。我认为我加权backgroundCanvas而不是根,你的代码做的伎俩! – Taiga

+0

在其他GUI框架中,您会看到像'root.add_to_grid(backgroundCanvas,column = 0,sticky = ...)'代替'backgroundCanvas.grid(...)'的东西,并且您将知道哪个小部件管理的网格和在哪里使用'grid_rowconfigure(...)':) – furas