第一次使用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.
我希望我足够清楚......对此事的任何帮助都会很棒。
答案 0 :(得分:1)
代替名称firstCanvas
,secondCanvas
使用列表和数字。
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 )
取代variableA
,variableB
,variableC
使用字典
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()
- 没有奖励 - 你也只得到部分矩形。
Tkinterbook:The Tkinter Grid Geometry Manager,The Tkinter Pack Geometry Manager