Как получить доступ к переменной в классе?- Python - Tkinter windows - PullRequest
0 голосов
/ 22 ноября 2018

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

Яразработка программного обеспечения Tkinter с несколькими окнами для навигации пользователя.В каждом окне будет набор вопросов, на которые нужно ответить, и цель состоит в том, чтобы сохранить все эти ответы в отдельный файл.Для простоты обслуживания я разработал каждое окно в отдельном файле, чтобы можно было легче отслеживать ошибки и изменения в самих окнах.

Не думаю, что проблема связана с использованием самого Tkinter, но я вставляю весь код (1 создание окна и 2 класса для определения вопросников), чтобы он был действующим рабочим кодом.

Если я изолирую одну анкету и создаю window = tk.Tk() для ее проверки, я могу использовать переменную de, но с представленной архитектурой №.

Мой код создания окна:

import tkinter as tk, Questions1 as q1, Questions2 as q2

#Software initial_class
class HAS(tk.Tk):    
def __init__(self, *args, **kwargs):
     tk.Tk.__init__(self, *args, *kwargs)
     #Page configure
     tk.Tk.wm_title(self, "Checklist")
     container = tk.Frame(self)
     container.pack(side="top", fill="both", expand=True)
     container.grid_rowconfigure(0, weight=1)
     container.grid_columnconfigure(0, weight=1)
     container.configure(background = "white")

    #Adding overhead menu
     menubar = tk.Menu(container)
     filemenu = tk.Menu(menubar, tearoff = 0)
     filemenu.add_command(label = "Save", command = print("In development"))
     filemenu.add_command(label = "Exit", command= self.destroy)
     menubar.add_cascade(label="File", menu=filemenu)
     tk.Tk.config(self, menu=menubar)

     #Defining the page_frames
     self.frames = {}
     for F in (q1.Q1, q2.Q2):
         frame = F(container, self)
         self.frames[F] = frame
         frame.grid(row=0, column=0, sticky="nsew")
     self.show_frame(q1.Q1)

#showing the selected frame              
def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()


app = HAS() 
app.geometry("530x700")
app.mainloop()

Моя первая страница анкеты:

import tkinter as tk
from tkinter import ttk  

FONT = ("Arial", 11)
choices_y_n = ['-', 'Yes', 'No'] 
Questionlist_a = ["A. Is true?:", "B. Is True? :","C. Is True? :", "D. True? :"]


def save_values():
    global y
    y = list(map(lambda x: x.get(), qt))
    print(y) 


class Q1(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.columnconfigure(0, minsize=100)
        self.columnconfigure(1, minsize=150)
        self.columnconfigure(2, minsize=50)     

    #Header Config
    tk.Frame.configure(self, background = "white")
    #tk.Label(self, image=Logo, background="white").grid(row=0, column=0, padx=100, columnspan=3, pady=10, sticky="W")
    ttk.Label(self, text="1st Checklist", font = FONT, background = "white").grid(row=1, column=0, columnspan=3, pady = 10)
    ttk.Label(self, text="Questions: ", background="white").grid(row=2, column=0,columnspan=2, padx=10, pady = 10, sticky="W")

    #Questions
    global qt
    qt = [tk.StringVar(self) for i in range(len(Questionlist_a))]
    for r in range(len(Questionlist_a)): 
        ttk.Label(self, text=Questionlist_a[r], background = "white").grid(row= r+3, column=0, columnspan=2, padx=10, pady = 10, sticky="W")
        ttk.OptionMenu(self, qt[r], *choices_y_n).grid(row = r+3, column=2, padx=10, sticky="WE")
        r=+1

    #Buttons  
    ttk.Button(self, text="Save values", command = save_values, width=18).grid(row=16, column=0, padx=10, pady=15, sticky="W")
    ttk.Button(self, text="Questions 2", command = lambda: controller.show_frame(__import__('Questions2').Q2),width=18).grid(row=17, column=0, padx=10, pady=15, sticky="W")

, а моя вторая анкета:

import tkinter as tk
from tkinter import ttk  

FONT = ("Arial", 11)
choices_y_n = ['-', 'Yes', 'No'] 
Questionlist_b = ["E. Is true?:", "F. Is True? :","G. Is True? :", "H. True? :"]


def save_values():
   global y
   y = list(map(lambda x: x.get(), qt))
   print(y) 


class Q2(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.columnconfigure(0, minsize=100)
        self.columnconfigure(1, minsize=150)
        self.columnconfigure(2, minsize=50)     

    #Header Config
    tk.Frame.configure(self, background = "white")

    ttk.Label(self, text="2nd Checklist", font = FONT, background = "white").grid(row=1, column=0, columnspan=3, pady = 10)
    ttk.Label(self, text="Questions: ", background="white").grid(row=2, column=0,columnspan=2, padx=10, pady = 10, sticky="W")

    #Questions
    global qt
    qt = [tk.StringVar(self) for i in range(len(Questionlist_b))]
    for r in range(len(Questionlist_b)): 
        ttk.Label(self, text=Questionlist_b[r], background = "white").grid(row= r+3, column=0, columnspan=2, padx=10, pady = 10, sticky="W")
        ttk.OptionMenu(self, qt[r], *choices_y_n).grid(row = r+3, column=2, padx=10, sticky="WE")
        r=+1

    #Buttons  
    ttk.Button(self, text="Save values", command = save_values, width=18).grid(row=16, column=0, padx=10, pady=15, sticky="W")
    ttk.Button(self, text="Questions 1", command = lambda: controller.show_frame(__import__('Questions1').Q1),width=18).grid(row=17, column=0, padx=10, pady=15, sticky="W")

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

Может кто-нибудь помочь мне с этим?

Большое спасибо!

1 Ответ

0 голосов
/ 24 ноября 2018

Если я правильно понял, вы хотите получить доступ к сохраненным ответам из главного окна.Для этого сначала нужно сделать функцию save_values методом классов Questions1 и Questions2 и создать свойство (я назвал его self.list_answers) для хранения ответов.

Итак, код первого класса будет (вопросник два можно сделать одинаково):

import tkinter as tk
from tkinter import ttk  

FONT = ("Arial", 11)
choices_y_n = ['-', 'Yes', 'No'] 
Questionlist_a = ["A. Is true?:", "B. Is True? :","C. Is True? :", "D. True? :"]


class Q1(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.columnconfigure(0, minsize=100)
        self.columnconfigure(1, minsize=150)
        self.columnconfigure(2, minsize=50)     

        #Header Config
        tk.Frame.configure(self, background = "white")
        #tk.Label(self, image=Logo, background="white").grid(row=0, column=0, padx=100, columnspan=3, pady=10, sticky="W")
        ttk.Label(self, text="1st Checklist", font = FONT, background = "white").grid(row=1, column=0, columnspan=3, pady = 10)
        ttk.Label(self, text="Questions: ", background="white").grid(row=2, column=0,columnspan=2, padx=10, pady = 10, sticky="W")

        #Questions
        global qt
        qt = [tk.StringVar(self) for i in range(len(Questionlist_a))]
        for r in range(len(Questionlist_a)): 
            ttk.Label(self, text=Questionlist_a[r], background = "white").grid(row= r+3, column=0, columnspan=2, padx=10, pady = 10, sticky="W")
            ttk.OptionMenu(self, qt[r], *choices_y_n).grid(row = r+3, column=2, padx=10, sticky="WE")
            r=+1

        #Buttons  
        ttk.Button(self, text="Save values", command = self.save_values, width=18).grid(row=16, column=0, padx=10, pady=15, sticky="W")
        ttk.Button(self, text="Questions 2", command = lambda: controller.show_frame(__import__('Questions2').Q2),width=18).grid(row=17, column=0, padx=10, pady=15, sticky="W")

        # List of answers
        self.list_answers=[]

    def save_values(self):
        self.list_answers = list(map(lambda x: x.get(), qt))

Затем вы можете получить доступ к list_answers вне класса.Например, я использовал кнопку «Сохранить» в файловом меню, чтобы создать словарь ответов на оба вопросника и распечатать его с помощью следующей функции:

    # Function accessing the list of answers
    def saveList(self):
        dict_answers={'Answers 1': self.frames[q1.Q1].list_answers, "Answers 2": self.frames[q2.Q2].list_answers}
        print(dict_answers)

Затем полный код главного окна.оставлено следующим образом:

import tkinter as tk, Questions1 as q1, Questions2 as q2

#Software initial_class
class HAS(tk.Tk):    
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, *kwargs)
        #Page configure
        tk.Tk.wm_title(self, "Checklist")
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        container.configure(background = "white")

        #Adding overhead menu
        menubar = tk.Menu(container)
        filemenu = tk.Menu(menubar, tearoff = 0)
        filemenu.add_command(label = "Save", command = self.saveList)
        filemenu.add_command(label = "Exit", command= self.destroy)
        menubar.add_cascade(label="File", menu=filemenu)
        tk.Tk.config(self, menu=menubar)

        #Defining the page_frames
        self.frames = {}
        for F in (q1.Q1, q2.Q2):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(q1.Q1)

    #showing the selected frame              
    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    # Function accessing the list of answers
    def saveList(self):
        dict_answers={'Answers 1': self.frames[q1.Q1].list_answers, "Answers 2": self.frames[q2.Q2].list_answers}
        print(dict_answers)


app = HAS() 
app.geometry("530x700")
app.mainloop()

Затем вы можете сохранить ответы, которые каждый вопросник имеет в каждый момент, нажав «Сохранить» в меню файла.Например, я нажал «Сохранить» перед заполнением любой анкеты, после заполнения первой и, наконец, после заполнения второй:

enter image description here

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