Python tkinter多个类和全局变量

Python tkinter多个类和全局变量,python,tkinter,Python,Tkinter,对python来说是个新手,我目前正试图用TKinter制作我的第一个GUI应用程序。该应用程序提示用户从4个下拉小部件中选择一个选项并选择提交,这将导出excel电子表格(仍需实现) 我让GUI自己工作,但是我在使用全局变量时遇到了问题,我需要在类之间使用全局变量 当前,当我运行代码时,出现错误“init()缺少1个必需的位置参数:“submissions”。 我曾尝试输入'submissions',例如'main_window=open_mainprogram(root,submission

对python来说是个新手,我目前正试图用TKinter制作我的第一个GUI应用程序。该应用程序提示用户从4个下拉小部件中选择一个选项并选择提交,这将导出excel电子表格(仍需实现)

我让GUI自己工作,但是我在使用全局变量时遇到了问题,我需要在类之间使用全局变量

当前,当我运行代码时,出现错误“init()缺少1个必需的位置参数:“submissions”。 我曾尝试输入'submissions',例如'main_window=open_mainprogram(root,submissions'),但这会产生错误:“未定义名称'submissions'

下面是我的GUI的主要类:

from tkinter import *
from global_stuff import *


#submissions = []

class open_mainprogram(global_stuff):

    #submissions = []

    def __init__(self, master, submissions):
        #define main window#
        self.master = master
        master.title("Easier checking")
        master.minsize(width=400, height=400)
        master.maxsize(width=800, height=800)

        #Program Description#
        self.program_description= Label(self.master, text =("This program is to speed up the checking process by automating the filling in of the check list."))
        self.program_description.grid(columnspan = 10)

        #Label drop down menu week 1#
        self.week_onelabel = Label(self.master, text = ("|Week One Checks:|"))
        self.week_onelabel.grid(row = 2, column = 1)

        #Create drop down menu week 1#
        self.check_progressone = StringVar(self.master)
        self.check_progressone.set("Pending")
        self.select_optionone = OptionMenu(self.master, self.check_progressone, "Pending", "Completed")
        self.select_optionone.grid(row = 3, column = 1)

        #week 2#
        #Label drop down menu#
        self.week_onelabel = Label(self.master, text = ("|Week Two Checks:|"))
        self.week_onelabel.grid(row = 2, column = 3)

        #Create drop down menu#
        self.check_progresstwo = StringVar(self.master)
        self.check_progresstwo.set("Pending")
        self.select_optiontwo = OptionMenu(self.master, self.check_progresstwo, "Pending", "Completed")
        self.select_optiontwo.grid(row = 3, column = 3)

        #week 3#
        #Label drop down menu#
        self.week_onelabel = Label(self.master, text = ("|Week Three Checks:|"))
        self.week_onelabel.grid(row = 2, column = 5)

        #Create drop down menu#
        self.check_progressthree = StringVar(self.master)
        self.check_progressthree.set("Pending")
        self.select_optionthree = OptionMenu(self.master, self.check_progressthree, "Pending", "Completed")
        self.select_optionthree.grid(row = 3, column = 5)

        #week 4#
        #Label drop down menu#
        self.week_onelabel = Label(self.master, text = ("|Week Four Checks:|"))
        self.week_onelabel.grid(row = 2, column = 7)

        #Create drop down menu#
        self.check_progressfour = StringVar(self.master)
        self.check_progressfour.set("Pending")
        self.select_optionfour = OptionMenu(self.master, self.check_progressfour, "Pending", "Completed")
        self.select_optionfour.grid(row = 3, column = 7)

        #submit button#
        def submitted(self, submissions):
            submitted_first = self.check_progressone.get()
            submitted_second = self.check_progresstwo.get()
            submitted_third = self.check_progressthree.get()
            submitted_fourth = self.check_progressfour.get()
            #global submissions
            submissions = submitted_first + submitted_second + submitted_third + submitted_fourth
            print (submissions)
            return (submissions)


        self.submit_button = Button(master, text = "Submit", command = submitted)
        self.submit_button.grid(row = 4, column = 1)

        #Exit button#
        self.exit_button = Button(master, text = "Exit", command = (master.destroy))
        self.exit_button.grid(row = 5, column = 8)

        return (submissions)


root = Tk()
main_window = open_mainprogram(root)
root.mainloop()
下面是我的全局变量类:

class global_stuff:

    submissions = []
我错过了什么

编辑: 如果我更改以下内容:

main_window = open_mainprogram(root)
届时:

main_window = open_mainprogram(root, global_stuff)

我收到错误“init()应该不返回任何值,而不是“type”

非常简单。在程序的最后,您尝试创建一个
主窗口

main_window = open_mainprogram(root)
将一个参数
root
传递给
open\u main程序
。也就是说,您正在创建一个
open\u mainprogram
类的实例(我认为它的名称不好——这个名称对我来说意味着它是一个函数,而不是一个类,但这是一个次要问题)。但是
open\u mainprogram
类的初始化函数需要两个参数:

def __init__(self, master, submissions):

不用说,当您尝试创建
open\u main程序
实例时,Python会抱怨您没有提供一个必要的参数,因为您只传递了一个,而初始化函数需要两个参数。

非常简单。在程序的最后,您尝试创建一个
主窗口

main_window = open_mainprogram(root)
将一个参数
root
传递给
open\u main程序
。也就是说,您正在创建一个
open\u mainprogram
类的实例(我认为它的名称不好——这个名称对我来说意味着它是一个函数,而不是一个类,但这是一个次要问题)。但是
open\u mainprogram
类的初始化函数需要两个参数:

def __init__(self, master, submissions):

不用说,当您尝试创建
open\u main程序
实例时,Python会抱怨您没有提供一个必要的参数,因为您只传递了一个,而初始化函数需要两个参数。

这将解决您的问题:

from tkinter import *


class global_stuff:

    submissions = []

    def test(self):

        print(self.submissions)


class TestClass(global_stuff):
    def __init__(self):
        self.test()


class open_mainprogram(global_stuff):

    def __init__(self, master):
        # define main window#
        self.master = master
        master.title("Easier checking")
        master.minsize(width=400, height=400)
        master.maxsize(width=800, height=800)

        # Program Description#
        self.program_description = Label(self.master,
                                         text="This program is to speed up the checking process by automating the "
                                              "filling in of the check list.")
        self.program_description.grid(columnspan=10)

        # Label drop down menu week 1#
        self.week_onelabel = Label(self.master, text="|Week One Checks:|")
        self.week_onelabel.grid(row=2, column=1)

        # Create drop down menu week 1#
        self.check_progressone = StringVar(self.master)
        self.check_progressone.set("Pending")
        self.select_optionone = OptionMenu(self.master, self.check_progressone, "Pending", "Completed")
        self.select_optionone.grid(row=3, column=1)

        # week 2#
        # Label drop down menu#
        self.week_onelabel = Label(self.master, text="|Week Two Checks:|")
        self.week_onelabel.grid(row=2, column=3)

        # Create drop down menu#
        self.check_progresstwo = StringVar(self.master)
        self.check_progresstwo.set("Pending")
        self.select_optiontwo = OptionMenu(self.master, self.check_progresstwo, "Pending", "Completed")
        self.select_optiontwo.grid(row=3, column=3)

        # week 3#
        # Label drop down menu#
        self.week_onelabel = Label(self.master, text="|Week Three Checks:|")
        self.week_onelabel.grid(row=2, column=5)

        # Create drop down menu#
        self.check_progressthree = StringVar(self.master)
        self.check_progressthree.set("Pending")
        self.select_optionthree = OptionMenu(self.master, self.check_progressthree, "Pending", "Completed")
        self.select_optionthree.grid(row=3, column=5)

        # week 4#
        # Label drop down menu#
        self.week_onelabel = Label(self.master, text="|Week Four Checks:|")
        self.week_onelabel.grid(row=2, column=7)

        # Create drop down menu#
        self.check_progressfour = StringVar(self.master)
        self.check_progressfour.set("Pending")
        self.select_optionfour = OptionMenu(self.master, self.check_progressfour, "Pending", "Completed")
        self.select_optionfour.grid(row=3, column=7)

        # submit button#
        def submitted():
            self.test()
            submitted_first = self.check_progressone.get()
            submitted_second = self.check_progresstwo.get()
            submitted_third = self.check_progressthree.get()
            submitted_fourth = self.check_progressfour.get()
            # global submissions
            self.submissions = submitted_first + submitted_second + submitted_third + submitted_fourth
            print(self.submissions)
            self.test()
            return self.submissions

        self.submit_button = Button(master, text="Submit", command=submitted)
        self.submit_button.grid(row=4, column=1)

        # Exit button#
        self.exit_button = Button(master, text="Exit", command=master.destroy)
        self.exit_button.grid(row=5, column=8)


root = Tk()
main_window = open_mainprogram(root)
root.mainloop()


这会解决你的问题。我在
global\u stuff
中定义了一个
test()
函数,并在
submitted()
函数的顶部和底部调用了该函数以确保代码正常工作,我还制作了一个
TestClass
以确保您的安全。

这将解决您的问题:

from tkinter import *


class global_stuff:

    submissions = []

    def test(self):

        print(self.submissions)


class TestClass(global_stuff):
    def __init__(self):
        self.test()


class open_mainprogram(global_stuff):

    def __init__(self, master):
        # define main window#
        self.master = master
        master.title("Easier checking")
        master.minsize(width=400, height=400)
        master.maxsize(width=800, height=800)

        # Program Description#
        self.program_description = Label(self.master,
                                         text="This program is to speed up the checking process by automating the "
                                              "filling in of the check list.")
        self.program_description.grid(columnspan=10)

        # Label drop down menu week 1#
        self.week_onelabel = Label(self.master, text="|Week One Checks:|")
        self.week_onelabel.grid(row=2, column=1)

        # Create drop down menu week 1#
        self.check_progressone = StringVar(self.master)
        self.check_progressone.set("Pending")
        self.select_optionone = OptionMenu(self.master, self.check_progressone, "Pending", "Completed")
        self.select_optionone.grid(row=3, column=1)

        # week 2#
        # Label drop down menu#
        self.week_onelabel = Label(self.master, text="|Week Two Checks:|")
        self.week_onelabel.grid(row=2, column=3)

        # Create drop down menu#
        self.check_progresstwo = StringVar(self.master)
        self.check_progresstwo.set("Pending")
        self.select_optiontwo = OptionMenu(self.master, self.check_progresstwo, "Pending", "Completed")
        self.select_optiontwo.grid(row=3, column=3)

        # week 3#
        # Label drop down menu#
        self.week_onelabel = Label(self.master, text="|Week Three Checks:|")
        self.week_onelabel.grid(row=2, column=5)

        # Create drop down menu#
        self.check_progressthree = StringVar(self.master)
        self.check_progressthree.set("Pending")
        self.select_optionthree = OptionMenu(self.master, self.check_progressthree, "Pending", "Completed")
        self.select_optionthree.grid(row=3, column=5)

        # week 4#
        # Label drop down menu#
        self.week_onelabel = Label(self.master, text="|Week Four Checks:|")
        self.week_onelabel.grid(row=2, column=7)

        # Create drop down menu#
        self.check_progressfour = StringVar(self.master)
        self.check_progressfour.set("Pending")
        self.select_optionfour = OptionMenu(self.master, self.check_progressfour, "Pending", "Completed")
        self.select_optionfour.grid(row=3, column=7)

        # submit button#
        def submitted():
            self.test()
            submitted_first = self.check_progressone.get()
            submitted_second = self.check_progresstwo.get()
            submitted_third = self.check_progressthree.get()
            submitted_fourth = self.check_progressfour.get()
            # global submissions
            self.submissions = submitted_first + submitted_second + submitted_third + submitted_fourth
            print(self.submissions)
            self.test()
            return self.submissions

        self.submit_button = Button(master, text="Submit", command=submitted)
        self.submit_button.grid(row=4, column=1)

        # Exit button#
        self.exit_button = Button(master, text="Exit", command=master.destroy)
        self.exit_button.grid(row=5, column=8)


root = Tk()
main_window = open_mainprogram(root)
root.mainloop()



这会解决你的问题。我在
global\u stuff
中定义了一个
test()
函数,并在
submitted()
函数的顶部和底部调用了该函数,以确保代码正常工作,我还制作了一个
TestClass
以确保您的正确性。

尝试在提交之前使用“self”,看看(只是一个想法)会出现错误“未定义名称“self”“不幸的是,如果您试图将
提交的内容
保存为
全局
,以便以后使用,我认为我有一个解决方案。我说的对吗?@DaniyalAhmad我在另一个类中创建了变量
submissions
,然后可以在多个类中使用它。您的
\uuuuuu init\uuuu
不应该返回任何内容。为什么它会返回
提交文件
?尝试在提交文件前使用“self”,并查看(只是一个想法)出现错误“name'self'未定义”不幸的是,如果您试图将
提交文件
保存为
全局
,以便以后使用,我认为我有一个解决方案。我说的对吗?@DaniyalAhmad我在另一个类中创建了变量
submissions
,然后可以在多个类中使用它。您的
\uuuuuu init\uuuu
不应该返回任何内容。为什么它返回
submissions
?那么我需要通过“main\u window=open\u mainprogram(root)”传递什么呢?无论
submissions
应该是什么。(请注意,在您再次返回变量之前,此变量似乎不会实际使用。来自
submitted
函数的
submitteds
在编程上是不相关的,尽管您给了它相同的名称,所以看起来您还没有意识到这一点。请注意,这将导致您的按钮无法工作。)那么,是什么让它与编程相关呢?当我看到行
def submitted(self,submissions):
从我的global_stuff类中提取
submissions
变量?@FraserClark no,它定义了一个函数,该函数具有一个完全不相关的参数,该参数恰好与
\uuuuu init\uuuuu
中的参数同名,因此我需要通过“main\u window=open\u mainprogram(root)”传递什么?无论
提交的是什么。(请注意,在您再次返回变量之前,此变量似乎不会实际使用。来自
submitted
函数的
submitteds
在编程上是不相关的,尽管您给了它相同的名称,所以看起来您还没有意识到这一点。请注意,这将导致您的按钮无法工作。)那么,是什么让它与编程相关呢?正如我所想的那样,
def submitted(self,submissions):
从我的global\u stuff类中提取了
submissions
变量?@FraserClark no,它定义了一个具有完全不相关的参数的函数,该参数恰好与
\uuu init\uu
中的参数具有相同的名称,谢谢,这已经成功了。因此,如果我想在任何其他类中使用提交,我需要将其称为
self.submissions
是否正确?@FraserClark是的,您必须将其称为
self.submissions
:)谢谢你,这已经奏效了。因此,如果我想在任何其他类中使用提交,我需要将其称为
self