簡體   English   中英

調用類並從另一個類繼承-Python 3

[英]Call class and inherit from another class - python 3

我有麻煩了。 我寫了兩個類,第一個是軟件的主要gui,第二個是登錄名。 現在,在登錄窗口中,我需要編寫一個小的驗證功能。 我寫了它,但是在驗證此函數調用主gui類並從Tk繼承后,我需要它。 我知道我的代碼很差,但是請幫忙。

class main_gui(Frame):
    def __init__(self,master, self.username, self.password):
        self.path = os.getcwd()
        self.master = master
        self.username = StringVar()
        self.password = StringVar()
        master.title("main menu")
        master.geometry("800x600")
        master.config(background="white")
        master.resizable(width="false", height="false")
        master.iconbitmap(self.path + r"/img/icon.ico")

        self.mmenu = Menu(master)
        self.menubar = Menu(self.mmenu, tearoff=0)
        self.menubar.add_command(label="about", command=aboutme)
        self.menubar.add_command(label="Exit!", command=master.destroy)
        self.mmenu.add_cascade(label="menu", menu=self.menubar)
        master.config(menu=self.mmenu)

class login(main_gui):
    def __init__(self):
        self.master.title("login")
        self.master.geometry("350x250")
        self.master.config(background="white")
        self.master.resizable(width="false", height="false")
        self.master.iconbitmap(self.path + r"/img/icon.ico")

        self.user_label = Label(master, text="user name")
        self.user_label.pack()
        self.user_value = Entry(master, textvariable=self.username)
        self.user_value.pack()

        self.password_label = Label(master, text="password")
        self.password_label.pack()
        self.password_value = Entry(master, textvariable=self.password)
        self.password_value.pack()

        self.login = Button(master, text="login" )
        self.login.pack()

    def validation(self):
        if self.username.get() == "admin" :
           main_gui()           
           root = Tk()
           hm = main_gui(root)
           root.mainloop()

您的main_gui類的初始化方法不太正確。 您需要將其更改為以下內容。

def __init__(self, master, username, password):
    self.path = os.getcwd()
    self.master = master
    self.username = username
    self.password = password
    master.title("main menu")
    master.geometry("800x600")
    master.config(background="white")
    master.resizable(width="false", height="false")
    master.iconbitmap(self.path + r"/img/icon.ico")

    self.mmenu = Menu(master)
    self.menubar = Menu(self.mmenu ,tearoff=0)
    self.menubar.add_command(label="about",command=aboutme)
    self.menubar.add_command(label="Exit!", command=master.destroy)
    self.mmenu.add_cascade(label="menu", menu=self.menubar)
    master.config(menu=self.mmenu)

您看到我做了什么更改嗎? self作為第一個參數傳遞給函數,然后在沒有self.情況下傳遞masterusername self. 這使您可以將它們的值分配給代碼正文中的self.masterself.username

希望這對您有用。

我認為您的想法是錯誤的。 您不需要繼承main_gui 這對我來說毫無意義。

看來您有兩個分開的窗口,可以用兩種方式使用。

第一:

  • 創建“登錄”作為主窗口,
  • 獲取登錄名/密碼,
  • 銷毀登錄名(所以您將沒有主窗口),
  • 創建MainGUI作為主窗口(使用登錄名/密碼作為參數)
  • 使用MainGUI

第二:

  • 創建MainGUI作為主窗口(可以隱藏它,也可以隱藏它),
  • 使用Toplevel登錄名創建為子級/子窗口/對話框(而不是主窗口),
  • 獲取登錄名/密碼(並輸入作為Mainlog的父級的MainGUI)
  • 銷毀登錄名(所以您仍然將MainGUI作為主窗口),
  • 使用MainGUI(取消隱藏后)

兩種情況都不需要繼承


第一個版本可能如下所示:

from tkinter import *
import sys
import os

class MainGui():

    def __init__(self, username, password):
        self.master = Tk()

        self.path = os.getcwd()
        self.path = os.path.realpath(sys.argv[0])

        self.username = StringVar(value=username)
        self.password = StringVar(value=password)

        self.master.title("main menu")
        self.master.geometry("800x600")
        self.master.config(background="white")
        self.master.resizable(width="false", height="false")
        #master.iconbitmap(self.path + r"/img/icon.ico")

        self.mmenu = Menu(self.master)
        self.menubar = Menu(self.mmenu ,tearoff=0)
        self.menubar.add_command(label="about",command=self.aboutme)
        self.menubar.add_command(label="Exit!", command=self.master.destroy)
        self.mmenu.add_cascade(label="menu", menu=self.menubar)

        self.master.config(menu=self.mmenu)

        self.master.mainloop()

    def aboutme(self):
        pass


class Login():

    def __init__(self):
        self.master = Tk()

        self.path = os.path.realpath(sys.argv[0])

        self.master.title("login")
        self.master.geometry("350x250")
        self.master.config(background="white")
        self.master.resizable(width="false", height="false")
        #self.master.iconbitmap(self.path + r"/img/icon.ico")

        self.username = StringVar()
        self.password = StringVar()

        self.user_label = Label(self.master, text="user name")
        self.user_label.pack()
        self.user_value = Entry(self.master, textvariable=self.username)
        self.user_value.pack()


        self.password_label = Label(self.master, text="password")
        self.password_label.pack()
        self.password_value = Entry(self.master, textvariable=self.password)
        self.password_value.pack()

        self.login = Button(self.master, text="login", command=self.validation)
        self.login.pack()

        self.message = Label(self.master)
        self.message.pack()

        self.message.mainloop()

    def validation(self):
        if self.username.get() == "admin" :
            self.master.destroy()
            MainGui(self.username.get(), self.password)
        else:
            self.message['text'] = "Wrong !!!"

# --- start ---     

Login()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM