繁体   English   中英

使用从一个 class 到另一个 tkinter 的变量

[英]Using a variable from one class to another tkinter

这是测试的完整代码,请运行它并告诉我是否可以在销毁框架后将用户名和密码存储在 class 之外

import tkinter as tk
    from tkinter import *
    from PIL import Image, ImageTk
    from tkinter import filedialog
    

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.title('Instagram Bot')
        self.geometry("500x500")
        self.switch_frame(StartPage)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()



class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="Enter Username").pack(side="top", fill="x", pady=10)
        self.username = tk.Entry(self,)
        self.username.pack()
        tk.Label(self, text='Enter Pssword').pack(side='top', fill='x', pady=10)
        self.password = tk.Entry(self)
        self.password.pack()
        self.password = self.password.get()
        self.username = self.username.get()
        # if(username.get('text') == None or password.get('text') == None):
        #     tk.Button(self, text="Login",
        #           command=lambda: master.switch_frame(StartPage)).pack()
        # else:
        
        tk.Button(self, text="Login", command=lambda: master.switch_frame(PageOne) and login_data()).pack()


class PageOne(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="Welcome").pack(side="top", fill="x", pady=10)
        tk.Button(self, text='Some text', command=lambda: master.switch_frame(Hashtag_page)).pack()

    def  __init__(self, master):
        tk.Frame.__init__(self, master)
        self.hastag_lbl = tk.Label(self, text='Choice file')
        self.hastag_lbl.pack(side='top',fill='x',pady=10)
        tk.Button(self, text='browse', command=self.browseFiles_hstg).pack()
        tk.Button(self, text='Start Bot', command=self.start_hashtag).pack()

        
    
    def browseFiles_hstg(self): 
        filename = filedialog.askopenfilename(initialdir = "/", 
                                          title = "Select a File", 
                                          filetypes = (("Text files", 
                                                        "*.txt*"), 
                                                       ("all files", 
                                                        "*.*"))) 
        # Change label contents 
        self.hastag_lbl.configure(text = filename)


    def start_hashtag(self):
        print(StartPage.username, StartPage.password)






if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

Tkinter 回调 Traceback(最近一次调用最后一次)中的异常:文件“/usr/lib/python3.6/tkinter/init .py”,第 1705 行,调用中返回self.func (*args) 文件“scofrlw.py”,第 71 行,在 start_hashtag print(StartPage.username, StartPage.password) AttributeError: type object 'StartPage' has no attribute 'username'


我会制作用户名和密码的字典,但根据您的 GUI,我不知道最适合您的选择

制作字典

dictionary = {}

class StartPage(tk.Frame):
   ...

添加用户名和密码的值。

def login_credentials(self):
    dictionary['password'] = self.password.get()
    dictionary['username'] = self.username.get()

然后你可以打印它们

def start_hashtag(self):
    print(dictionary['username'],dictionary['password'])

在下面的代码中,我一直将凭据存储在主 (SampleApp) 中,该凭据也可以从您的 class PageOne 访问。

或者,您可以考虑将凭据存储在 dict 中,并在初始化期间将其传递给 PageOne。

import tkinter as tk
from tkinter import *
#from PIL import Image, ImageTk
from tkinter import filedialog


class SampleApp(tk.Tk):
    def __init__(self):
        self.test = "I am the MasterAPP"
        tk.Tk.__init__(self)
        self._frame = None
        self.title('Instagram Bot')
        self.geometry("500x500")
        self.switch_frame(StartPage)

        self.username = None
        self.password = None

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()



class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="Enter Username").pack(side="top", fill="x", pady=10)
        self.username = tk.Entry(self,)
        self.username.pack()
        tk.Label(self, text='Enter Pssword').pack(side='top', fill='x', pady=10)
        self.password = tk.Entry(self)
        self.password.pack()


        tk.Button(self, text="Login",
            command=lambda:
                self.login()
        ).pack()


    def login(self):
        self.save_credentials()
        self.master.switch_frame(PageOne)


    def save_credentials(self):
        self.master.password = self.password.get()
        self.master.username = self.username.get()




class PageOne(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="Welcome").pack(side="top", fill="x", pady=10)
        tk.Button(self, text='Some text', command=lambda: master.switch_frame(Hashtag_page)).pack()

    def  __init__(self, master):
        tk.Frame.__init__(self, master)
        self.hastag_lbl = tk.Label(self, text='Choice file')
        self.hastag_lbl.pack(side='top',fill='x',pady=10)
        tk.Button(self, text='browse', command=self.browseFiles_hstg).pack()
        tk.Button(self, text='Start Bot', command=self.start_hashtag).pack()



    def browseFiles_hstg(self):
        filename = filedialog.askopenfilename(initialdir = "/",
                                          title = "Select a File",
                                          filetypes = (("Text files",
                                                        "*.txt*"),
                                                       ("all files",
                                                        "*.*")))
        # Change label contents
        self.hastag_lbl.configure(text = filename)


    def start_hashtag(self):
        print(self.master.username, self.master.password)






if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

您的代码中有几个问题:

  • 不应在创建self.usernameself.password之后调用self.password = self.password.get()self.username = self.username.get()因为它们都是空字符串并覆盖对两个Entry小部件。

  • usernamepasswordStartPage的实例变量,因此不能通过StartPage.usernameStartPage.password访问

  • PageOne class 中的两个__init__() function 定义

  • 切换帧时,前一帧被破坏。 所以usernamepassword也将被销毁,无法再访问。

您可以使用SampleApp的实例来存储usernamepassword ,以便其子框架可以访问它们:

class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="Enter Username").pack(side="top", fill="x", pady=10)
        self.username = tk.Entry(self,)
        self.username.pack()
        tk.Label(self, text='Enter Pssword').pack(side='top', fill='x', pady=10)
        self.password = tk.Entry(self)
        self.password.pack()
        tk.Button(self, text="Login", command=self.login).pack()

    def login(self):
        # store the username and password in instance of 'SampleApp'
        self.master.username = self.username.get()
        self.master.password = self.password.get()
        # switch to PageOne
        self.master.switch_frame(PageOne)

class PageOne(tk.Frame):
    def  __init__(self, master):
        tk.Frame.__init__(self, master)
        self.hastag_lbl = tk.Label(self, text='Choice file')
        self.hastag_lbl.pack(side='top',fill='x',pady=10)
        tk.Button(self, text='browse', command=self.browseFiles_hstg).pack()
        tk.Button(self, text='Start Bot', command=self.start_hashtag).pack()
    
    def browseFiles_hstg(self): 
        filename = filedialog.askopenfilename(initialdir = "/", 
                                              title = "Select a File", 
                                              filetypes = (("Text files", 
                                                            "*.txt*"), 
                                                           ("all files", 
                                                            "*.*"))) 
        # Change label contents
        if filename:
            self.hastag_lbl.configure(text = filename)

    def start_hashtag(self):
        # get username and password from instance of SampleApp
        print(self.master.username, self.master.password)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM