【问题标题】:How do you add label to another window tkinter using OOP如何使用 OOP 将标签添加到另一个窗口 tkinter
【发布时间】:2020-06-05 00:02:34
【问题描述】:

当我将标签添加到第二个窗口时,它不会添加到它添加到第一个窗口的第二个窗口。

class testing:
    def __init__(self,root):
        root.config(bg='orange')
        root.geometry("500x500")
        lbl = Label(text="WOW TEXT").pack()


class login:
    def __init__(self,root):
        root.config(bg='orange')
        root.geometry("500x500")
        self.login_form(root)


    def login_onlick(self):
        c.execute("SELECT * FROM Login WHERE Name = ? AND Password = ?",(self.e_name.get(),self.e_pass.get()))
        self.right_login = c.fetchall()

        if self.right_login:
            print("Login Now")
            self.top = testing(root=Tk())
        else:
            print("Wrong")    


    def login_form(self,root):
        self.lg_form=Label(root, text="Login Form",font="Times 40",bg='red',width=50)
        self.lg_form.pack()

        self.lbl_name=Label(root, text="Enter Name",font="times 20",bg='orange')
        self.lbl_name.pack()
        self.e_name = Entry(root,width=50)
        self.e_name.pack()
        self.lbl_pass=Label(root, text="Enter Password",font="times 20",bg='orange')
        self.lbl_pass.pack()
        self.e_pass = Entry(root,width=50)
        self.e_pass.pack()
        self.btn_create = Button(root,text="Login", bg ='green',width=13,height=4,command= self.login_onlick)
        self.btn_create.pack()

root = Tk()

login(root)

conn.commit()

root.mainloop()

The Output of My Program

【问题讨论】:

  • 您忘记为该标签指定父级;您对所有其他小部件都正确执行了此操作。但请注意,第二次调用Tk() 会给你带来很多麻烦——你应该使用Toplevel() 来创建额外的窗口。

标签: python oop tkinter


【解决方案1】:

虽然如果已经创建了主窗口,那么创建Tk() 实例而不是Toplevel() 实例是个坏主意,但这不会引起您的问题,也没有必要在此处将Tk() 替换为Toplevel()

当您在 Testing 类中创建 Label 小部件时,您应该指定它所属的窗口,否则,它将尝试自动找到它(并不总是会选择正确的窗口)。只需将 Testing 类替换为:

class Testing:
    def __init__(self, root):
        root.config(bg='orange')
        root.geometry("500x500")
        Label(root, text="WOW TEXT").pack()

【讨论】:

    【解决方案2】:

    您需要使用Toplevel() 作为任何辅助窗口,tkinter 不能很好地处理多个Tk() 调用。

    我也尝试修复您的间距和一些函数名称,例如 init__init__

    from tkinter import *
    
    class testing:
        def __init__(self, root):
            root.config(bg='orange')
            root.geometry("500x500")
            lbl = Label(text="WOW TEXT").pack()
    
    class login:
        def __init__(self, root):
            self.login_form(root)
    
        def login_onlick(self, root):
            # Commented out for Testing
            #c.execute("SELECT * FROM Login WHERE Name = ? AND Password = ?",(self.e_name.get(),self.e_pass.get()))
            #self.right_login = c.fetchall()
            self.right_login = True #TESTING
            if self.right_login:
                    print("Login Now")
                    self.login_form(Toplevel(root))
            else:
                    print("Wrong")
    
        def login_form(self, root):
            root.config(bg='orange')
            root.geometry("500x500")
    
            self.lg_form=Label(root, text="Login Form",font="Times 40",bg='red',width=50)
            self.lg_form.pack()
    
            self.lbl_name=Label(root, text="Enter Name",font="times 20",bg='orange')
            self.lbl_name.pack()
    
            self.e_name = Entry(root,width=50)
            self.e_name.pack()
    
            self.lbl_pass=Label(root, text="Enter Password",font="times 20",bg='orange')
            self.lbl_pass.pack()
    
            self.e_pass = Entry(root,width=50)
            self.e_pass.pack()
    
            self.btn_create = Button(root,text="Login", bg ='green',width=13,height=4,command=lambda:self.login_onlick(root))
            self.btn_create.pack()
    
    root = Tk()
    login(root)
    
    # Commented out for Testing
    #conn.commit()
    
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2021-03-06
      • 1970-01-01
      相关资源
      最近更新 更多