【问题标题】:Call class and inherit from another class - python 3调用类并从另一个类继承 - python 3
【发布时间】:2017-11-28 10:41:19
【问题描述】:

我遇到了麻烦。我写了两个类,第一个是软件的主界面,第二个是登录。现在,在登录窗口中,我需要编写一个小的验证函数。我写了它,但在我验证这个函数调用主 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()

【问题讨论】:

  • validation 内执行main_gui - 至于我的类login 不应该从其他类继承。作为表单,您应该在 main_gui 类中使用类 login 作为任何其他小部件。
  • 如果login 必须从main_gui 继承,那么您必须在login.__init__() 内使用super().__init__()
  • 顺便说一句:如果你在文件夹 A 中有程序并且你在文件夹 B 中运行它,那么 os.getcwd() 会给你 B 但你可能会期望 A 得到图像。正确路径给出os.path.realpath(sys.argv[0])

标签: python python-3.x class tkinter


【解决方案1】:

您的 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 作为第一个参数传入函数,然后传入 masterusername,不带 self.。这允许您将它们的值分配给代码正文中的self.masterself.username

希望这对你有用。

【讨论】:

  • 谢谢你的回复,是的,但是我的大问题是从其他类调用类并进行继承,请看代码的最后部分
  • 对不起,我不明白。您能否编辑您的原始问题以包含您想要发生的详细信息,以及您使用的代码实际会发生什么。请包含任何错误消息和意外行为。
【解决方案2】:

我认为你的想法是错误的。您不需要从main_gui 继承。这对我来说毫无意义。

看起来您有两个分开的窗口,您可以通过两种方式使用它们。

第一:

  • 创建登录为主窗口,
  • 获取登录名/密码,
  • 销毁登录(所以你不会有主窗口),
  • 创建 MainGUI 作为主窗口(使用登录名/密码作为参数)
  • 使用 MainGUI

第二个:

  • 创建MainGUI作为主窗口(可以隐藏也可以不隐藏),
  • 使用Toplevel将登录创建为子窗口/子窗口/对话框(而不是主窗口),
  • 获取登录名/密码(并放入作为登录名的父级的 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2019-03-30
    • 2014-11-22
    相关资源
    最近更新 更多