![](/img/trans.png)
[英]How can I modify a variable being used in one class from another class by using 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.username
和self.password
之后调用self.password = self.password.get()
和self.username = self.username.get()
因为它们都是空字符串并覆盖对两个Entry
小部件。
username
和password
是StartPage
的实例变量,因此不能通过StartPage.username
和StartPage.password
访问
PageOne
class 中的两个__init__()
function 定义
切换帧时,前一帧被破坏。 所以username
和password
也将被销毁,无法再访问。
您可以使用SampleApp
的实例来存储username
和password
,以便其子框架可以访问它们:
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.