tkinter несколько классов и глобальные переменные - PullRequest
0 голосов
/ 23 января 2020

Довольно плохо знаком с python, и в настоящее время я пытаюсь создать свое первое GUI приложение с TKinter. Приложение предлагает пользователю выбрать вариант из 4 раскрывающихся виджетов и выбрать «Отправить». Это приведет к экспорту электронной таблицы Excel (все еще для реализации).

Я получил GUI, работающий сам по себе, но я возникли проблемы с использованием глобальной переменной, которую мне нужно использовать между классами.

В настоящее время, когда я запускаю код, я получаю ошибку " init (), пропускающая 1 обязательный позиционный аргумент: 'submissions'" , Я попытался ввести «представления», например, «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, а не 'type'"

Ответы [ 2 ]

1 голос
/ 23 января 2020

Это решит вашу проблему:

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, чтобы убедиться, что вы.

1 голос
/ 23 января 2020

Довольно просто. В самом конце вашей программы вы пытаетесь создать main_window:

main_window = open_mainprogram(root)

Вы передаете один аргумент, root, open_mainprogram. То есть, вы создаете экземпляр класса open_mainprogram (я думаю, что он плохо назван - имя подразумевает для меня, что это функция, а не класс, но это побочная проблема). Но функция инициализации класса open_mainprogram требует двух аргументов:

def __init__(self, master, submissions):

Само собой разумеется, когда вы пытаетесь создать свой экземпляр open_mainprogram, Python жалуется, что вы не сделали t предоставить один из необходимых аргументов, потому что вы передаете только один, когда функция инициализации требует двух.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...