Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这些按钮构造函数的行为不同_Python_Tkinter - Fatal编程技术网

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

Python 为什么这些按钮构造函数的行为不同,python,tkinter,Python,Tkinter,在以下代码中,构造按钮的两种方式的作用不同: 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( ro

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

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

这就给出了期望的结果。谢谢大家

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

除非我弄错了,否则对于范围(2)中的I,您需要
buttons=(Button(root,command=lambda I:foo(I))
,这样
I
的值就会传递给lambda。不要认为这是对的,Burhan;实际上,它似乎抛出了一个异常,因为按钮没有传递任何东西,也没有向函数传递任何参数。这只是示例代码,我擅长创建根窗口:)我更关心按钮传递的参数的行为