0

在以下代码中,两种构造按钮的方式不同:

from Tkinter import *
def buildButton1():
    root = Tk()
    Button( root, command = lambda : foo(1) ).pack()
    Button( root, command = lambda : foo(2) ).pack()

def buildButton2():
    root = Tk()
    buttons = ( Button( root, command = lambda : foo(i) ) for i in range(2) )
    map( lambda button : button.pack(), buttons )

def foo( number ):
    print number

这两种方法都使 Tkinter 窗口具有两个表面上相同的按钮布局,但在第二个示例中——如果我们添加 50 个按钮而不是 2,这似乎更简洁——传递给 foo 的值是最后一次迭代的 i。

所以在这种情况下,按下任何用 buildButton2 制作的按钮都会打印 1,而 buildButton1 的按钮分别打印 0 和 1。为什么有区别?有没有办法让 buildButton2 按预期工作?

编辑 有人指出,这是一个重复的问题,构造这个更正确的方法是写:

 buttons = ( Button( root, command = lambda i=i : foo(i) ) for i in range(2) )

这给出了预期的结果。多谢你们!

4

1 回答 1

0

您的应用程序应该只有 1 个 TK 根。这只是您应用程序中的示例还是真实代码?如果它是真正的代码,那么您每次“生成”按钮时都会尝试获取 TK 根。您应该将 root=TK() 移动到您的主代码中,因为您的应用程序只有一个根。每个窗口,按钮..都是这个根的孩子。

你可以尝试这样的事情:

from tkinter import *
from tkinter import ttk

    class testWnd( ttk.Frame ):  

        def createWndMain( self ):
            self.BtnLoad = ttk.Button( self, text="Load file", command=self.LoadMyFile )
            self.BtnLoad.grid( column=10, row=10, padx=8, pady=4, sticky=( S, E, W ) )

            self.BtnQuit = ttk.Button( self, text="Quit", command=self.quit )
            self.BtnQuit.grid( column=10, row=20, padx=8, pady=4, sticky=( S, E, W ) )

            self.Spacer = ttk.Frame( self, height = 12 )
            self.Spacer.grid( column = 10, row = 15, sticky = ( S, E, W ) )

            self.columnconfigure( 5, weight = 1 )
            self.rowconfigure( 5, weight = 1 )

        def LoadMyFile( self ):
            pass

        def __init__( self, tkRoot ):
            ttk.Frame.__init__( self, tkRoot )
            tkRoot.title( "My Application v 1.0" )
            tkRoot.columnconfigure( 0, weight = 1 )
            tkRoot.rowconfigure( 0, weight = 1 )
            self.tkRoot = tkRoot
            self.grid( column = 0, row = 0, sticky = ( N, S, E, W ) )
            self.createWndMain()

    tkRoot = Tk()
    myWndMain = testWnd( tkRoot )
    myWndMain.mainloop()
于 2013-10-31T05:43:32.643 回答