输入详细信息时未在文件中获取值,为空?

Not getting a value in the file when inputting details, its blank?

提问人:spxrk_17 提问时间:11/17/2023 最后编辑:Cowspxrk_17 更新时间:11/17/2023 访问量:31

问:

我对编码和 Stack Overflow 比较陌生。我正在为我的学校项目制作一款 tkinter 游戏。我正在努力的部分本质上是获取 regUser() 和 regPass() 的值输入,并将它们添加到帐户文件.txt。我最初得到了 PYVAR0 和 PYVAR1,但我在网上看到使用 .get() 可以解决这个问题。现在添加了空格和 /n,但没有添加 regUser 或 regPass 的任何内容。

这一切都与 register() 和 NOT login() 有关(这将在以后完成),但如果有人能发现我在尝试检查 username() 和 password() 的输入值时可能遇到的问题与文件中保存的名称和密码,或者确实有任何关于如何做到这一点的建议,那将是惊人的。目前的首要任务是解决当前的问题,尽管:(。

代码如下:

from tkinter import *
from tkinter import ttk
import tkinter as tk

def welcomeScreen():
    welcomeScreen = tk.Tk()
    welcomeScreen.title("Welcome")
    welcomeScreen.geometry("300x300")

    choice = tk.Label(text="Welcome to Investor, please log in or register an account")
    choice.pack()
   
    loginButton1 = tk.Button(welcomeScreen, text="Log in", command=lambda: [login(), welcomeScreen.destroy()])
    loginButton1.pack()
    regButton1 = tk.Button(welcomeScreen, text="Register", command=lambda: [register(), welcomeScreen.destroy()])
    regButton1.pack()
    welcomeScreen.mainloop()

def login():
    global username; tk.StringVar()
    global password; tk.StringVar()
    loginScreen = tk.Tk()
    loginScreen.geometry("400x300")
    loginScreen.title("Log in to your account")
    login1 = tk.Label(loginScreen, text="Please log in to your account")
    login1.pack()
   
    signIn = ttk.Frame(loginScreen)
    signIn.pack()
   
    lbl_username = ttk.Label(signIn, text="Username:")
    lbl_username.pack(fill='x', expand=True)

    entry_username = Entry(signIn, textvariable=username)
    entry_username.pack(fill='x', expand=True)
    entry_username.focus()

    lbl_password = ttk.Label(signIn, text="Password:")
    lbl_password.pack(fill='x', expand=True)

    entry_password = ttk.Entry(signIn, textvariable=password, show="*")
    entry_password.pack(fill='x', expand=True)

    btn_login = Button(signIn, text="Login", command=login)
    btn_login.pack()
    btn_back1 = Button(signIn, text="Back", command=lambda: [loginScreen.destroy(), welcomeScreen()])
    btn_back1.pack()

def register():
    global regUser
    regUser=tk.StringVar()
    global regPass
    regPass=tk.StringVar()

    regScreen = tk.Tk()
    regScreen.geometry("400x300")
    regScreen.title("regsiter")
    register1 = tk.Label(regScreen, text="Please create a account")
    register1.pack()
   
    register = ttk.Frame(regScreen)
    register.pack()
   
    lbl_createName = ttk.Label(register, text="Create an username:")
    lbl_createName.pack(fill='x', expand=True)

    entry_createName = Entry(register, textvariable=regUser)
    entry_createName.pack(fill='x', expand=True)
    entry_createName.focus()

    lbl_createPass = ttk.Label(register, text="Create an password:")
    lbl_createPass.pack(fill='x', expand=True)

    entry_createPass = ttk.Entry(register, textvariable=regPass)
    entry_createPass.pack(fill='x', expand=True)

    btn_reg = Button (register, text='Register', command=createUser)
    btn_reg.pack()
    btn_back2= Button(register, text="Back", command=lambda: [regScreen.destroy(), welcomeScreen()])
    btn_back2.pack()

def createUser():
    file = open("accountfile.txt","a")
    file.write(str(regUser.get()))
    file.write(" ")
    file.write(str(regPass.get()))
    file.write("\n")
    file.close()    
   
welcomeScreen()
蟒蛇 tkinter

评论

1赞 Karl Knechtel 11/17/2023
欢迎使用 Stack Overflow。请阅读如何提问。我们在这里不写“找到错误”的答案;我们需要一个具体的问题 - 这将是你理解定位特定问题的最佳尝试,并在一个最小的可重复的例子中展示它。适合 Stack Overflow 的问题是,你已经弄清楚了代码中执行与预期不同的操作的特定部分(您应该具体期望某些内容),并且不明白为什么。
0赞 Tim Roberts 11/17/2023
仅供参考,前两行是错误的。您需要使用与 中使用的相同的模式。loginregister
0赞 Karl Knechtel 11/17/2023
用你自己的话来说,代码上写着,你认为这到底意味着什么?“这一切都与 register() 和 NOT login() 有关(稍后会完成)” - 那你为什么要向我们展示 的代码 ,或者制作登录按钮的代码?global username; tk.StringVar()login
1赞 TheLizzard 11/17/2023
主要问题是你有 2 个窗口,但你没有传入 s 的主控窗口。要么用于所有不是主窗口的窗口(在您的情况下可能很复杂),要么添加到所有 s 以便它们知道它们属于哪个,要么交换 =>但这会给您留下类似的登录页面问题。tk.TkStringVartk.Toplevelmaster=...tk.StringVartk.Tk[register(), welcomeScreen.destroy()][welcomeScreen.destroy(), register()]
0赞 Tim Roberts 11/17/2023
@JohnGordon 也许你错过了他控件上的参数。这就是更新这些变量的原因。textvariableEntry

答:

0赞 Tim Roberts 11/17/2023 #1

这里的微妙问题是 StringVar 必须与窗口相关联。如果未指定,则默认为当前根窗口,即 ,在创建新窗口后不久将其销毁。因此,这些变量变得“无家可归”。这样做:welcomeScreen

def register():
    global regUser
    global regPass

    regScreen = tk.Tk()
    regScreen.geometry("400x300")
    regScreen.title("regsiter")
    register1 = tk.Label(regScreen, text="Please create an account")
    register1.pack()

    register = ttk.Frame(regScreen)
    register.pack()

    regUser = tk.StringVar(register)
    regPass = tk.StringVar(register)

在函数中需要相同的内容。login