Python 两个tk窗口而不是一个

Python 两个tk窗口而不是一个,python,windows,tkinter,tk,Python,Windows,Tkinter,Tk,我是tkinter的新手,我想创建一个带有“条目”的tkinter界面,一个带有图片和按钮的画布。我只希望有一个tk窗口,但当我运行代码时,还有第二个小的空tk窗口。我想这是因为我上的课,但我不确定。。 这是我的密码: from tkinter import* import tkinter as tk import time class Application(Tk): def __init__(self,transfo,nb_itération): Tk.__init

我是tkinter的新手,我想创建一个带有“条目”的tkinter界面,一个带有图片和按钮的画布。我只希望有一个tk窗口,但当我运行代码时,还有第二个小的空tk窗口。我想这是因为我上的课,但我不确定。。 这是我的密码:

from tkinter import*
import tkinter as tk
import time

class Application(Tk):
    def __init__(self,transfo,nb_itération):
        Tk.__init__(self)
        self.transfo = transfo
        self.nb_itération = nb_itération



    def affichage_graphique(self):

        self.matrix_hex = extraction_rgb(tk.PhotoImage(file='obama_128.gif'))
        self.width , self.height = len(self.matrix_hex[0]) , len(self.matrix_hex)
        self.WIDTH, self.HEIGHT = 8*self.width+6, 8*self.height+6
        self.cnv = Canvas(self, width=self.WIDTH, height=self.HEIGHT, bg='white',highlightthickness=0)
        self.cnv.grid(row = 2 , columnspan = 3)
        self.txt1 = Label(self, text = 'Transformation :').grid(row = 0 , sticky = E)
        self.txt2 = Label(self, text = 'Nombre d\'itérations : ').grid(row = 1 , sticky = E)
        self.entr1 = Entry(self)
        self.entr2 = Entry(self)

        self.entr1.grid(row = 0, column = 1, sticky = W)
        self.entr2.grid(row = 1, column = 1, sticky = W)
        Button(self, text="Quitter", command=self.destroy).grid(row = 0 , column = 2)

        if self.transfo == photomaton or self.transfo == boulanger:

            print("valeur par défaut mauvaise")
            self.cnv.delete(ALL)
            self.img01 = self.PhotoImage(width=self.width*4, height=self.height*4)
            self.img = self.PhotoImage(width=self.width*4, height=self.height*4)

            self.matrix_hex4 = [[x for x in range(self.width*4)] for y in range(self.height*4)]
            self.matrix_4 = [[x for x in range(self.width*4)] for y in range(self.height*4)]


            self.img.put(data=self.matrix_4 , to=(0,0))   
            self.cnv.create_image(0, 0, image=self.img, anchor=tk.NW)

            self.img01.put(data=self.matrix_hex4, to=(0,0))
            self.cnv.create_image(self.WIDTH, 0, image=self.img01, anchor=tk.NE)
            self.cnv.bind('<Button-1>',self.click_handler)

        else:

            self.img = tk.PhotoImage(width=self.width*4, height=self.height*4)
            self.img.put(data=self.matrix_4 , to=(0,0))   
            self.cnv.create_image(0, 0, image=self.img, anchor=tk.NW)
            self.entr1.insert(0,"photomaton")
            self.entr2.insert(0,"1")
            self.entr2.bind("<Return>",Programme().Enter)



class Programme(Application):
    def __init__(self,transfo = 0, nb_itération = 0 ,orbites  =[],période = []):
        self.choice = 0
        self.orbites = orbites
        self.période = période
        self.transfo = transfo
        self.nb_itération = nb_itération
        Application.__init__(self, self.transfo , self.nb_itération)


    def Enter(self,event):
        self.choix_transfo = self.entr1.get()
        self.nb_itération = self.entr2.get()
        return self.choix_transfo , self.nb_itération

    def start(self):
        self.affichage_graphique()



prog = Programme()
prog.start()
prog.mainloop()
从tkinter导入*
将tkinter作为tk导入
导入时间
班级申请:
定义初始(自我、转换、注意):
Tk.\uuuuuu初始(自我)
self.transfo=transfo
self.nb_itération=nb_itération
def affichage_graphique(自身):
self.matrix_hex=extraction_rgb(tk.PhotoImage(file='obama_128.gif'))
self.width,self.height=len(self.matrix_hex[0]),len(self.matrix_hex)
self.WIDTH,self.HEIGHT=8*self.WIDTH+6,8*self.HEIGHT+6
self.cnv=Canvas(self,width=self.width,height=self.height,bg='white',highlightthickness=0)
self.cnv.grid(行=2,列span=3)
self.txt1=Label(self,text='Transformation:').grid(row=0,sticky=E)
self.txt2=Label(self,text='Nombre d'itérations:').grid(row=1,sticky=E)
self.entr1=条目(self)
self.entr2=条目(self)
self.entr1.grid(行=0,列=1,粘性=W)
self.entr2.grid(行=1,列=1,粘性=W)
按钮(self,text=“Quitter”,command=self.destroy).grid(行=0,列=2)
如果self.transfo==photomaton或self.transfo==boulanger:
打印(“Valeur-Pd ffout Mavayes”)
self.cnv.delete(全部)
self.img01=self.PhotoImage(宽度=self.width*4,高度=self.height*4)
self.img=self.PhotoImage(宽度=self.width*4,高度=self.height*4)
self.matrix_hex4=[[x表示范围内的x(self.width*4)]表示范围内的y(self.height*4)]
self.matrix_4=[[x表示范围内的x(self.width*4)]表示范围内的y(self.height*4)]
self.img.put(data=self.matrix_4,to=(0,0))
self.cnv.create_image(0,0,image=self.img,anchor=tk.NW)
self.img01.put(data=self.matrix_hex4,to=(0,0))
self.cnv.create_image(self.WIDTH,0,image=self.img01,anchor=tk.NE)
self.cnv.bind(“”,self.click\u处理程序)
其他:
self.img=tk.PhotoImage(宽度=self.width*4,高度=self.height*4)
self.img.put(data=self.matrix_4,to=(0,0))
self.cnv.create_image(0,0,image=self.img,anchor=tk.NW)
自我输入1.插入(0,“影像标记”)
自我输入2.插入(0,“1”)
self.entr2.bind(“,program().Enter)
课程计划(申请):
定义初始(self,transfo=0,nb_itération=0,轨道=[],période=[]):
self.choice=0
self.orbites=轨道
self.période=période
self.transfo=transfo
self.nb_itération=nb_itération
应用程序。初始化(self,self.transfo,self.nb\itération)
def Enter(自我,事件):
self.choix_transfo=self.entr1.get()
self.nb_itération=self.entr2.get()
返回self.choix_transfo,self.nb_itération
def启动(自):
self.affichage_graphique()
prog=程序()
程序启动()
prog.mainloop()

问题似乎出在这一行:

    self.entr2.bind("<Return>",Programme().Enter)
要调用当前
程序
实例的
方法,请输入
,或

    self.entr2.bind("<Return>", lambda: Program().Enter)
self.entr2.bind(“,lambda:Program().Enter)
如果您确实希望在单击按钮时创建第二个
程序
窗口;但是,在这种情况下,您还必须调用
gui
方法来初始化小部件



请注意,正如注释中所讨论的,您的代码中还有一些其他问题,但我假设这些问题在您的实际代码中并不存在,否则您将不会出现这种行为。

问题似乎在这一行:

    self.entr2.bind("<Return>",Programme().Enter)
要调用当前
程序
实例的
方法,请输入
,或

    self.entr2.bind("<Return>", lambda: Program().Enter)
self.entr2.bind(“,lambda:Program().Enter)
如果您确实希望在单击按钮时创建第二个
程序
窗口;但是,在这种情况下,您还必须调用
gui
方法来初始化小部件



请注意,正如注释中所讨论的,代码中还存在一些其他问题,但我假设这些问题在实际代码中并不存在,否则您将无法获得这种行为。

您正在两个位置创建一个新窗口。首先,关于这一点:

prog = Programme()
第二点是:

self.entr2.bind("<Return>",Programme().Enter)

您将在两个位置创建一个新窗口。首先,关于这一点:

prog = Programme()
第二点是:

self.entr2.bind("<Return>",Programme().Enter)

您的代码中有几个错误使我无法运行它,请发布一个。例如,
Program.\uuuu init\uuuu
在参数列表后缺少冒号。另外,在
程序中有一个无限递归。我的猜测是:(a)您有几个类都扩展了
Tk
,或者(b)您有一个类扩展了
Tk
,还手动创建了一个“根”
Tk
实例。但无法检查,因为代码有错误(语法和运行时)。我建议不要扩展
Tk
,而是扩展
Frame
。您的代码中没有任何内容可以创建两个窗口。但是,我看到您使用了
program()
,但是没有这个名称的类或函数。您有一个名为
Program
——其中一个是打字错误吗?@tobias_k:是的,如果是打字错误,那么肯定会创建第二个窗口。这就是为什么我要求澄清这一点。我猜这个问题中的代码不是真正的代码,因为这个代码不会创建两个窗口。我们不需要完整的代码,我们需要一个最小的、完整的、可验证的示例。请尽量减少代码,使其尽可能小,但仍然可以运行,并且仍然显示出您所说的错误。此外,我们不需要看到两个版本的程序。编辑您的answ