迭代将小部件放在Tkinter和Pmw中

时间:2016-03-16 18:36:32

标签: user-interface python-3.x tkinter refactoring pmw

我通过在Python中使用循环在我的项目中创建,格式化和存储Pmw EntryFields而不是构建单独的小部件,大大减少了重复代码的数量。我甚至设法在根窗口上以线性方式放置它们 - 在第0列中将它们放在另一个下面。

但是,当我想将它们放在两列中时,我找不到生成以下小部件行和列坐标的方法

来自for循环的

(0,0)(0 1),(1,0)(1,1)(2,0)(2,1)。我使用了一种解决方法,即将上面的坐标键入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

你可以在main for循环中看到我迭代列表名为locations 并将值放在grid()选项的行,列属性中以放置小部件。

问题:完全消除位置列表,有一种方法可以生成序列(0,0)(0 1),(1,0)(1,1)(2,0)(2,1) )来自for循环iteself?

2 个答案:

答案 0 :(得分:1)

所有情况的一般答案是你可以使用for()

[Required(ErrorMessage = ("Only alpha numeric characters are allowed.")), Display(Name = "Program Codes"), RegularExpression(@"^[a-zA-Z0-9]*$")]
public string ProgramCode
{
    get 
    {
        return _programCode;
    }
    set
    {
        if (OnPropertyChanging("ProgramCode", _programCode, value))
        {
            var oldValue = _programCode;
            _programCode = value;
            OnPropertyChanged("ProgramCode", oldValue, value);
            OnProgramCodeChanged();
        }
    }
}

或增加计数器

for this_row in range(3):
    for this_column in range(2):
         print this_row, this_column

或测试nextWidget%2 =与上面类似但是divmod比这个

的模数更好
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

答案 1 :(得分:1)

(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)
>>>