【问题标题】:How can I run this code without using global variables?如何在不使用全局变量的情况下运行此代码?
【发布时间】:2020-02-18 19:21:40
【问题描述】:

(要使错误显示您必须按下注册按钮)请记住,我认为自己处于编码的初学者水平。我正在为学校的受控评估及其虚构的公会做一个项目,我必须创建一个具有登录/注册系统、发票系统和订单系统的界面。这些变量以前是全局变量,我试图弄清楚如何运行相同的代码而不必使它们成为全局变量。有人告诉我使用参数和这个“TypeError: FSSignup() missing 3 required positional arguments: 'eUsername', 'ePassword', and 'signupPage'”出现了。 这是我的代码:

from tkinter import *
import os

details = 'tempfile.temp'  # sets variable details as tempfile


def signup():  # signup subroutine

    signupPage = Tk()  # makes empty signup window
    signupPage.geometry("450x400")  # sets size of window 500 pixels by 300
    signupPage.title("Signup for The Guild of Ceramic Arts")  # adds a title to the window

    introL = Label(signupPage, text="Please enter your details: ", font=("Arial", 15))  # heading
    introL.place(x=105, y=10)

    userL = Label(signupPage, text="New Username: ", font=("Arial", 14))  # user's detail's labels
    pwL = Label(signupPage, text="New Password: ", font=("Arial", 14))
    userL.place(x=20, y=50)
    pwL.place(x=20, y=80)

    eUsername = Entry(signupPage, font=("Arial", 14))  # user's detail's entries
    ePassword = Entry(signupPage, font=("Arial", 14), show='*')

    eUsername.place(x=170, y=50)  # Places entries for details
    ePassword.place(x=170, y=80)


    # adds signup button and command runs the subroutine named 'FSSignup' short for file save sign up
    signupB = Button(signupPage, text="Signup", font=("Arial", 12), command=FSSignup)
    signupB.place(x=180, y=360)

    mainloop()


def FSSignup(eUsername,  ePassword, signupPage):
    with open(details, 'w') as f:
        f.write(eUsername.get())
        f.write('\n')
        f.write(ePassword.get())
        f.write('\n')
        f.write(eForename.get())
        f.write('\n')
        f.write(eSurname.get())
        f.write('\n')
        f.write(eEmail.get())
        f.write('\n')
        f.write(ePhoneNum.get())
        f.write('\n')
        f.write(eAddress.get())
        f.write('\n')
        f.write(eCity_Town.get())
        f.write('\n')
        f.write(eCounty.get())
        f.close()

    signupPage.destroy()
    login()


def login():
    loginPage = Tk()
    loginPage.geometry("400x200")
    loginPage.title("Login for the Guild of Ceramic Arts")

    headingL = Label(loginPage, text="Please login: ", font=("Arial", 15))
    headingL.place(x=140, y=20)

    userL = Label(loginPage, text="Username: ", font=("Arial", 14))
    passwordL = Label(loginPage, text="Password: ", font=("Arial", 14))
    userL.place(x=20, y=50)
    passwordL.place(x=20, y=80)

    eUser = Entry(loginPage, font=("Arial", 14))
    epw = Entry(loginPage, font=("Arial", 14), show='*')
    eUser.place(x=120, y=50)
    epw.place(x=120, y=80)

    loginB = Button(loginPage, text='Login', font=("Arial", 12), command=checkLogin)
    loginB.place(x=130, y=120)

    delUserB = Button(loginPage, text='Delete User', fg='red', command=delUser, font=("Arial", 12))
    delUserB.place(x=190, y=120)

    mainloop()


def checkLogin(eUser, epw):
    with open(details) as f:
        data = f.readlines()
        uname = data[0].rstrip()
        pword = data[1].rstrip()

    if eUser.get() == uname and epw.get() == pword:
        return mainMenu()
    else:
        r = Tk()
        r.title('error')
        r.geometry('150x50')
        rlbl = Label(r, text='\n Invalid Login')
        rlbl.pack()
        r.mainloop()


def delUser(loginPage):
    os.remove(details)  # Removes the file
    loginPage.destroy()  # Destroys the login window
    signup()  # And goes back to the start


def mainMenu():
    pass



signup()

【问题讨论】:

  • 您是否尝试过创建Minimal, Reproducible Example
  • 您发布的代码太多,不适合 stackoverflow。请尝试将其减少到minimal reproducible example。如果你有 10 个全局变量的问题,你可以用一个全局变量来说明同样的问题。
  • ""TypeError: FSSignup() 缺少 3 个必需的位置参数:":您已定义:def FSSignup(eUsername, ePassword, signupPage):,但您调用:@ 987654327@. 你认为争论是从哪里来的?
  • 第一个问题是您有多个 tk 实例。您应该更新框架或新的顶层窗口,而不是创建多个 tk 实例。第二个问题是你在函数中构建所有东西。因为你这样做了,所以你别无选择,只能使用全局变量或将变量从一个函数传递到另一个函数。最好的选择是使用类来构建它,就像使用 OOP 一样,您可以避免使用类属性的全局。下一个最好的事情是在全局命名空间中构建您的 tk 实例,然后从那里开始并在函数之间传递变量。

标签: python tkinter parameters global local


【解决方案1】:

将您的代码放入main 函数中。这样您就可以避免使用任何全局变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多