首页 > 解决方案 > 通过类传递变量并在 Tkinter 中使用 .get() 来查找用户输入

问题描述

class Menu():
    def __init__(self):
        pass
    def menuWindow(self):
        
        menu = Tk()
        menu.title("Menu")
        menu.geometry("300x250")

        menuFrame = Frame(menu)
        menuFrame.pack()
        
        menu = Menu()
        
        menuLabel = Label(menuFrame, font="Helvetica 18 bold", text="MENU")
        menuLabel.grid(row=0, column=0, sticky=W)


        cDirF = TaskWindowMaker()
        cDir = Button(menuFrame, text="Create Directory", command=cDirF.cDirWindow, height=2,width=20)
        cDir.grid(row=2, column=0, sticky=W)
        
        cProfF = TaskWindowMaker()
        cProf = Button(menuFrame, text="Create Profiles", command=cProfF.cProfWindow, height=2,width=20)
        cProf.grid(row=3, column=0, sticky=W)
        
        dProfF = TaskWindowMaker()
        dProf = Button(menuFrame, text="Delete Profiles", command=dProfF.dProfWindow, height=2,width=20)
        dProf.grid(row=6, column=0, sticky=W)

        mSenderF = TaskWindowMaker()
        mSender = Button(menuFrame, text="Make Sender", command=mSenderF.mSenderWindow, height=2,width=20)
        mSender.grid(row=8, column=0, sticky=W)
        
        sendParcelF = TaskWindowMaker()
        sParcel = Button(menuFrame, text="Send Parcel", command=sendParcelF.sendParcelWindow, height=2,width=20)
        sParcel.grid(row=10, column=0, sticky=W)
    
    
class ProfileDeveloper(object):
def __init__(self,):
    pass
def create_folder_profiles(self):
    global directoryNamecProfWindow

    y = False
    while y == False:
        path = os.getcwd()
        print(path)

        y = numbercProfWindow.get()#int(input("Number of profiles: "))
        print(y)
        #y = int(y)
        p = os.getcwd()+("\profiles")#Reading number file in profiles
        n = ("number")
        d = os.path.join(p,n)
        try:
            dirName = directoryNamecProfWindow.get()#input("Directory name :")
            print(dirName+"OO")
            path = os.getcwd()+("\profiles")
            folderDir = os.path.join(path, dirName)
            with open(folderDir+"profile.txt","x") as f:
                print("Opened.")
        except FileNotFoundError:
            print("File not found.")
        except FileExistsError:
            messagebox.showerror("Error","File already exists.")

        for a in range(y):
            with open(d+".txt","r") as z:
                num = z.read()
            num = int(num)
            newNum = (int(num)+1)
            numProf = ("profile"+str(newNum))
            with open(d+".txt","w") as file:
                file.write(str(newNum))
            path = os.getcwd()+("\profiles")
            folderDir = os.path.join(path, dirName,numProf)
            with open(folderDir+".txt","x") as f:
                print("Created '"+numProf+"'.")
        y = True
            #except:
    print("Saved to "+folderDir+"\n")
     
     
class TaskWindowMaker(object):
    def __init__(self):
        pass
    def cProfWindow(self):

        global numbercProfWindow
        cProf = Tk()
        cProf.title("Create Profiles")
        cProf.geometry("300x250")

        cProfFrame = Frame(cProf)
        cProfFrame.pack()
                
        titleLabel = Label(cProfFrame, font="Helvetica 18 bold", text="Create Profiles")
        titleLabel.grid(row=0, column=0, sticky=W)
        
        menuLabel = Label(cProfFrame, text="Folder Name")
        menuLabel.grid(row=1, column=0, sticky=W)

        directoryNamecProfWindow = StringVar()
        cDirEntry = Entry(cProfFrame, textvariable=directoryNamecProfWindow)
        cDirEntry.grid(row=1, column=1, sticky=W)

        menuLabel = Label(cProfFrame, text="Number of Profiles")
        menuLabel.grid(row=2, column=0, sticky=W)
        
        numbercProfWindow = StringVar()
        cDirEntry = Entry(cProfFrame, textvariable=numbercProfWindow)
        cDirEntry.grid(row=2, column=1, sticky=W)

        cProfF = ProfileDeveloper(directoryNamecProfWindow)
        cDir = Button(cProfFrame, text="Enter", command=cProfF.create_folder_profiles, height=2,width=20)
        cDir.grid(row=3, column=0, sticky=W)

start = Menu()
start.menuWindow()

这是我的代码。我正在打开多个窗口。然后当我在输入框中输入

numbercProfWindow = StringVar()
        cDirEntry = Entry(cProfFrame, textvariable=numbercProfWindow)
        cDirEntry.grid(row=2, column=1, sticky=W)

然后我使用按钮:

cProfF = ProfileDeveloper(directoryNamecProfWindow)
        cProf = Button(cProfFrame, text="Enter", command=cProfF.create_folder_profiles, height=2,width=20)
        cProf.grid(row=3, column=0, sticky=W)

将输入发送到 ProfileDeveloper.create_folder_profiles 当它被发送到 ProfileDeveloper.create_folder_profiles 时,程序无法识别输入,因为它不是 '.get()ing it'。

我很新,所以不知道如何在不同函数之间传递变量以及使用 .get() 函数或全局变量。

该程序的主要目的是在指定文件夹中创建配置文件(txt 文件)。我试图添加一个 Tkinter GUI,而不是它是 shell 中的脚本。

希望这能像我之前问过的那样解释它,而人们只是太困惑了。还有很多我没有显示的代码,但是传递变量之间的混淆在整个代码中继续存在,所以不确定。代码真的很长,只是在 Shell 中运行,然后我添加了 Tkinter GUI,它通过加倍变量而变得复杂,现在这个,所以非常感谢任何帮助。

谢谢 :)

标签: pythonclassvariablestkinterparameter-passing

解决方案


此示例是否有助于您更好地理解您可以做什么:

from tkinter import Tk, Entry, Button


root = Tk()


class UserInput:
    def __init__(self, master):
        self.master = master

        self.entry = Entry(self.master)
        self.entry.pack()

        self.button = Button(self.master, text='Submit', command=self.submit)
        self.button.pack()

    def submit(self):
        entry_var = self.entry.get()
        print(entry_var)


user_input = UserInput(root)
root.mainloop()

推荐阅读