Ссылка на переменную из другого класса - PullRequest
0 голосов
/ 15 апреля 2020
  • Я отредактировал свой код из того, что я опубликовал в оригинале. Я использовал пример, который был упрощен. Я добавляю в словарь 'my dict' в классе CalcVar и хочу отобразить обновленное значение на странице 'Display Var'.

Я предоставил свой код ниже. Нет ошибки, но она не работает так, как мне хотелось бы. В классе 'Display Var' я показываю вывод для myvar. Я хочу, чтобы на нем было два ярлыка: один с надписью «dict 1», а другой с надписью «dict 2». Прямо сейчас это просто вытягивает первоначальное значение 'dict 1'. Первым шагом для программы является go на странице Cal c Var, и я добавляю 'dict 2' к mydict. Оттуда я хочу go перейти на страницу «Показать переменную» и отобразить отредактированный словарь так, чтобы он отображал «dict 1» и «dict 2», но он будет отображаться только как «dict 1». Как мне сделать так, чтобы оно показывалось как «dict 1» и «dict 2»?

Любая помощь приветствуется!

import tkinter as tk

LARGE_FONT= ("Times New Roman", 22)


class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global mydict
        mydict = {'dict1' : {"a b c" : 123}} # set its value


        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (CalcVar, DisplayVar):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)


        def addvar():
            global mydict
            #myvar.set(myvar.get()+" c") # when add the value.
            dict2 = {'d e f' : 456}
            mydict['dict 2'] = dict2
            print(mydict)



        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)



        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()


        calcbutton = tk.Button(self, text="AddVar",
                            command=addvar)
        calcbutton.pack()



class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global mydict

        for x, y in mydict.items():
            label = tk.Label(self, text=x, font=LARGE_FONT) 
            label.pack(pady=10,padx=10)


        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

1 Ответ

1 голос
/ 15 апреля 2020

Ваша проблема не в «ссылке на переменную из другого класса». Когда вы запускаете ее в первый раз, текст «a, b». Даже если вы в следующий раз вызовете addvar(), текст в метке выиграет не может быть изменено. Вы можете использовать textvariable вместо text в виджете Label.

С последующим кодом:

import tkinter as tk

LARGE_FONT= ("Verdana", 12)

class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global myvar # global
        myvar = tk.StringVar() # create a StringVar and assign it myvar
        myvar.set("a b") # set its value

        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (CalcVar, DisplayVar):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        def addvar():
            global myvar
            myvar.set(myvar.get()+" c") # when add the value.
            print(myvar.get())

        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()

        calcbutton = tk.Button(self, text="AddVar",
                            command=addvar)
        calcbutton.pack()

class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global myvar

        label = tk.Label(self, textvariable=myvar, font=LARGE_FONT) # bind a textvariable not text
        label.pack(pady=10,padx=10)
        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

app = MyApp()
app.geometry('750x500')

app.mainloop()

Редактировать: Принцип тот же, даже если вы хотите использовать dict. Самый простой способ - использовать textvaribale. Но если вы хотите показать строку в dict. Просто используйте myvar.set(xx), чтобы установить ее.

import tkinter as tk

LARGE_FONT= ("Verdana", 12)

class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global myvar,mydict # global
        mydict = {'dict 1' : {"a b c" : 123}}
        myvar = tk.StringVar() # create a StringVar and assign it myvar
        myvar.set(" ".join(i for i in mydict)) # set "dict 1" string

        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (CalcVar, DisplayVar):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        def addvar():
            global myvar,mydict
            dict2 = {'d e f' : 456}
            mydict['dict 2'] = dict2 # add it to your dict
            myvar.set(" ".join(i for i in mydict)) # also set the vale and show it.
            print(myvar.get())

        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()

        calcbutton = tk.Button(self, text="AddVar",
                            command=addvar)
        calcbutton.pack()

class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global myvar

        label = tk.Label(self, textvariable=myvar, font=LARGE_FONT) # bind a textvariable not text
        label.pack(pady=10,padx=10)
        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

app = MyApp()
app.geometry('750x500')

app.mainloop()

Я настоятельно рекомендую вам просто использовать \n, чтобы присоединиться к ним (это очень просто и быстро), если вы действительно хотите создать два виджета с метками. Это код (возможно, это не лучший способ):

import tkinter as tk

LARGE_FONT= ("Verdana", 12)

class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global mydict # global
        mydict = {'dict 1' : {"a b c" : 123}}

        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (CalcVar, DisplayVar):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        def addvar(p,c):
            global mydict
            for i in p.winfo_children()[0].winfo_children(): # delete all the widget in the displayVar
                i.pack_forget()
            mydict['dict 2']={'d e f':456}
            for i in mydict: # then pack them in it.
                tk.Label(p.winfo_children()[0],text=i).pack(pady=10,padx=10)
            button1 = tk.Button(p.winfo_children()[0], text="Back to Calculation Page",
                                command=lambda: c.show_frame(CalcVar))
            button1.pack()

        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()

        calcbutton = tk.Button(self, text="AddVar",
                            command=lambda :addvar(parent,controller))
        calcbutton.pack()

class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global mydict

        for i in mydict:
            print(i)
            tk.Label(self, text=i).pack(pady=10, padx=10)
        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

app = MyApp()
app.geometry('750x500')

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