繁体   English   中英

tkinter 多个类和全局变量

[英]tkinter multiple classes and global variables

Python 的新手,我目前正在尝试使用 TKinter 制作我的第一个 GUI 应用程序。 该应用程序提示用户从 4 个下拉小部件中选择一个选项并选择提交,这将导出一个 excel 电子表格(仍在实施)。

我让 GUI 独立工作,但我在使用需要在类之间使用的全局变量时遇到问题。

目前,当我运行代码时,我收到错误“ init () 缺少 1 个必需的位置参数:‘提交’”。 我试过像这样输入'提交''main_window = open_mainprogram(root,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 () 应该返回 None,而不是‘类型’”

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

main_window = open_mainprogram(root)

您将一个参数root传递给open_mainprogram 也就是说,您正在创建open_mainprogram类的一个实例(我认为它的名字很糟糕——这个名字暗示我它是一个函数,而不是一个类,但这是一个附带问题)。 但是open_mainprogram类的初始化函数需要两个参数:

def __init__(self, master, submissions):

不用说,当您尝试创建open_mainprogram实例时,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()

这将解决您的问题。 我已经定义了一个test()内部函数global_stuff ,并呼吁它的顶部和底部的submitted()函数,以确保您的代码的作品,我也做了一个TestClass ,以确保您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM