Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 为什么我从一开始就有两个tkinter窗口?_Python_Tkinter - Fatal编程技术网

Python 为什么我从一开始就有两个tkinter窗口?

Python 为什么我从一开始就有两个tkinter窗口?,python,tkinter,Python,Tkinter,我试图用一个按钮创建一个窗口,该按钮可以创建另一个窗口 m = Tk() def new(a,b): r = Tk() r.geometry(str(a) + "x" + str(b) + "+0+0") b = Button(m, text="Click", command=new(100,300)).place(x=0,y=0) m.mainloop() 没有点击按钮,我得到了两个窗口,而不是一个带按钮的窗口 我做错了什么?在构造按钮时调用new(从技术上讲,在

我试图用一个按钮创建一个窗口,该按钮可以创建另一个窗口

m = Tk() 

def new(a,b): 
    r = Tk()
    r.geometry(str(a) + "x" + str(b) + "+0+0")

b = Button(m, text="Click", command=new(100,300)).place(x=0,y=0)

m.mainloop()
没有点击按钮,我得到了两个窗口,而不是一个带按钮的窗口

我做错了什么?

在构造
按钮时调用
new
(从技术上讲,在构造
按钮之前,因为
new
必须完成运行,所以它的返回值可以作为
命令
参数传递),而不是作为回调传递给单击调用

您需要传递一个(无参数)作为
命令调用,而不调用它,例如,使用
lambda
包装
新的
调用,从而将其延迟到调用
lambda
为止:

b = Button(m, text="Click", command=lambda: new(100,300)).place(x=0,y=0)

在按钮调用中,您被称为新函数。该函数正在创建一个新的Tk实例。这就是为什么有两个窗口打开

假设您想在第一个Tk实例上运行geometry操作,只需将Tk对象传递到新函数中即可

你可以这样做:

from tkinter import *

m = Tk()

def new(a, b, r):
    r.geometry(str(a) + "x" + str(b) + "+0+0")

b = Button(m, text="Click", command=new(100, 300, m)).place(x=0, y=0)

m.mainloop()

@BryanOakley因为在init上执行按钮命令的问题在我认为更大的问题是OP使用
Tk()
两次导致了双窗口,而不是像应该的那样使用
Toplevel
。OPs的主要问题是关于在按下按钮时创建第二个窗口,但他们的做法是错误的,这应该通过一个好的答案或一个与在程序中使用两次
Tk()
相关的重复问题来解决。即使他们使用了
Toplevel
,他们在启动时仍然会得到两个窗口。他们得到两个窗口的原因是因为
命令
vs
命令()。我同意两次使用
Tk()
是一个问题,但这不是他们要问的问题。@BryanOakley Ya有命令vs命令()的问题我只是认为,这个问题的两部分性质应该得到更好的解释,而不是仅仅联系解决这里一半的问题。这实际上无助于解决老年退休金问题。他们想要打开第二个窗口,并且应该使用
Toplevel
作为其功能内部的窗口。另外,您还没有修复在init上运行命令的问题。哦,您是对的,我没有全部阅读。