为什么这些按钮构造函数的行为不同

2024-09-27 00:14:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

从而得到预期的结果。谢谢你们!你知道吗


Tags: lambdainforfootkinterdefbuttonroot
1条回答
网友
1楼 · 发布于 2024-09-27 00:14:07

应用程序应该只有一个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()

相关问题 更多 >

    热门问题