在 Tkinter 和 Pmw 中放置小部件的迭代
Iteration to place widgets in Tkinter and Pmw
我通过在 Python 中使用循环在我的项目中创建、格式化和存储 Pmw EntryFields 而不是构建单独的小部件,从而大大减少了重复代码的数量。我什至设法将它们以线性方式放在根 window 上——在第 0 列中一个在另一个下面。
但是,当我想将它们放在两列中时,我找不到生成以下小部件行和列坐标的方法
(0,0)(0 1),(1,0)(1,1)(2,0)(2,1) 来自 for 循环。我使用了一种解决方法,即将上述坐标键入 Python 列表并引用该列表。
import tkinter
import Pmw
import time
root=tkinter.Tk() #Create a main GUI window
root.option_readfile('optionDB') #Override Windows default fonts
##root.resizable(width=False, height=False) #Fix the window size in stone
root.iconbitmap('logo.ico') #add logo
titles=['a', 'b','c', 'd','e','f'] #List ttitles of entry fields
**locations=[(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)]** #Entry locations
entry ={} #Container for referencing entry fieleds
for nextWidget in range(len(titles)): #Buils widgets on the page
dummy_x= Pmw.EntryField(root, #widget properties
labelpos = 'w',
label_text = titles[nextWidget],
label_fg="white",
entry_width=10
)
Pmw.Color.changecolor(dummy_x.component("hull"),
background="blue")
**dummy_x.grid(row= locations[nextWidget][0],**
column=locations[nextWidget][1],
padx=10,pady=10
)
entry.update({titles[nextWidget]: dummy_x}) #add to container
root.mainloop() #run the venet loop
您可以在主 for 循环中看到,我遍历了名为 locations 的 列表,并将值放在 grid() 选项的行、列属性中以放置小部件.
问题:
要完全消除位置列表,有没有办法生成序列 (0,0)(0 1),(1,0)(1,1)(2,0)( 2,1) 来自 for 循环本身?
所有情况的一般答案是您可以使用 for()
for this_row in range(3):
for this_column in range(2):
print this_row, this_column
或递增计数器
this_row=0
this_column=0
for nextWidget in range(len(titles)):
...
this_column += 1
if this_column > 1:
this_row += 1
this_column = 0
或测试 nextWidget%2 = 与上面类似,但 divmod 比 modulus 更有效
for ctr in range(6):
print divmod(ctr, 2)
(i/2, i%2)
(python2) 或 (i//2, i%2)
(python3) 会给你你想要的数字,如果你只需要两列
$ python3 -i
Python 3.4.0 (default, Jun 19 2015, 14:20:21)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(10):
... print((i//2, i%2))
...
(0, 0)
(0, 1)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(3, 0)
(3, 1)
(4, 0)
(4, 1)
>>>
我通过在 Python 中使用循环在我的项目中创建、格式化和存储 Pmw EntryFields 而不是构建单独的小部件,从而大大减少了重复代码的数量。我什至设法将它们以线性方式放在根 window 上——在第 0 列中一个在另一个下面。
但是,当我想将它们放在两列中时,我找不到生成以下小部件行和列坐标的方法
(0,0)(0 1),(1,0)(1,1)(2,0)(2,1) 来自 for 循环。我使用了一种解决方法,即将上述坐标键入 Python 列表并引用该列表。
import tkinter
import Pmw
import time
root=tkinter.Tk() #Create a main GUI window
root.option_readfile('optionDB') #Override Windows default fonts
##root.resizable(width=False, height=False) #Fix the window size in stone
root.iconbitmap('logo.ico') #add logo
titles=['a', 'b','c', 'd','e','f'] #List ttitles of entry fields
**locations=[(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)]** #Entry locations
entry ={} #Container for referencing entry fieleds
for nextWidget in range(len(titles)): #Buils widgets on the page
dummy_x= Pmw.EntryField(root, #widget properties
labelpos = 'w',
label_text = titles[nextWidget],
label_fg="white",
entry_width=10
)
Pmw.Color.changecolor(dummy_x.component("hull"),
background="blue")
**dummy_x.grid(row= locations[nextWidget][0],**
column=locations[nextWidget][1],
padx=10,pady=10
)
entry.update({titles[nextWidget]: dummy_x}) #add to container
root.mainloop() #run the venet loop
您可以在主 for 循环中看到,我遍历了名为 locations 的 列表,并将值放在 grid() 选项的行、列属性中以放置小部件.
问题: 要完全消除位置列表,有没有办法生成序列 (0,0)(0 1),(1,0)(1,1)(2,0)( 2,1) 来自 for 循环本身?
所有情况的一般答案是您可以使用 for()
for this_row in range(3):
for this_column in range(2):
print this_row, this_column
或递增计数器
this_row=0
this_column=0
for nextWidget in range(len(titles)):
...
this_column += 1
if this_column > 1:
this_row += 1
this_column = 0
或测试 nextWidget%2 = 与上面类似,但 divmod 比 modulus 更有效
for ctr in range(6):
print divmod(ctr, 2)
(i/2, i%2)
(python2) 或 (i//2, i%2)
(python3) 会给你你想要的数字,如果你只需要两列
$ python3 -i
Python 3.4.0 (default, Jun 19 2015, 14:20:21)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(10):
... print((i//2, i%2))
...
(0, 0)
(0, 1)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(3, 0)
(3, 1)
(4, 0)
(4, 1)
>>>