Найти - Пользователи
Полная версия: Как изменить метку с другого класса
Начало » GUI » Как изменить метку с другого класса
1
Novator
Приветствую!
Подскажите, как изменить метку с другого класса? Как к ней обратиться для изменения ее свойств?
Код примерно такой (обрезан от всего лишнего):
 from tkinter import Tk, Frame, BOTH
from tkinter.ttk import Button, Label, Style
from tkinter import messagebox
from tkinter.filedialog import askopenfilename
class Rem():
    def open_file(self):
        self.a = []
        self.filename = askopenfilename(initialdir = "D:/Documents",title = "Выберите файл для работы",filetypes = (("Import files","Import.txt"),("All files","*.*")))
        with open(self.filename, "r", encoding='utf-8') as f:
            for line in f:
                if not line.isspace():
                    self.a.append(line.replace('\n', ''))
        f.close()
        Gui.lbl1.config(text=str(self.filename).replace('/', '\\'))
        return a
class Gui(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.parent.title("Coiner")
        self.pack(fill=BOTH, expand=1)
        self.centerWindow()
        self.initUI()
    def initUI(self):
        btn1 = Button(self.parent, text='', command=Rem().open_file)
        btn1.place(x=5, y=5, height=32, width=32)
        self.lbl1 = Label(self.parent, text="Файл не выбран", font=("Arial", 10))
        self.lbl1.place(relx=.5, rely=1, anchor="s", height=20, width=800)
   def centerWindow(self):
        w = 800
        h = 600
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        x = (sw - w) / 2
        y = (sh - h) / 2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))
        self.parent.resizable(False, False)
    def main():
        root = Tk()
        Gui(root)
        root.mainloop()
def main():
    Gui.main()
if __name__ == '__main__':
    main()
Почему нет реакции на строку:
 Gui.lbl1.config(text=str(self.filename).replace('/', '\\'))
И второй вопрос прямо связан с первым - как получить значение переменной без вызова функции?
В данном случае - получить список “а”, но не писать что-то такое:
 a = self.open_file()
У меня просто в зависимости от переданного параметра генерируется разный список, и получается, что три раза вызывается эта функция с диалоговым окном открытия файла. А так бы - я раз открыл файл, и потом обрабатывал уже саму переменную.
AD0DE412
не очень понимаю что у вас как и зачем но вот код для примера

 from tkinter import Tk, Frame, BOTH
from tkinter.ttk import Button, Label, Style
from tkinter import messagebox
from tkinter.filedialog import askopenfilename
class Rem:
    # общая для всех экземпляров класса
    a = []
    def open_file(self):
        self.filename = askopenfilename(
            initialdir="D:/Documents",
            title="Выберите файл для работы",
            filetypes=(("Import files","Import.txt"),
                       ("All files","*.*")))
        with open(self.filename, "r", encoding='utf-8') as f:
            for line in f:
                if not line.isspace():
                    self.a.append(line.replace('\n', ''))
        f.close()
        #- example меняем текст
        global win
        win.lbl1['text'] = "xz"
        #-
        return self.a
    
    def set_a(self, val):
        self.a = val
    def get_a(self):
        return self.a
        
class Gui(Frame):
    
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.parent.title("Coiner")
        self.pack(fill=BOTH, expand=1)
        self.rem = Rem()
        self.centerWindow()
        self.initUI()
        
    # очнь странная конструкция
    def initUI(self):
        btn1 = Button(
            self.parent, text='', command=self.rem.open_file)
        #- example получаем и меняем переменную в другом классе
        print(f"get a - {self.rem.get_a()}")
        self.rem.set_a([1, 2])
        print(f"get a after set_a([1, 2]) - {self.rem.get_a()}")
        #-
        btn1.place(x=5, y=5, height=32, width=32)
        self.lbl1 = Label(
            self.parent, text="Файл не выбран", font=("Arial", 10))
        self.lbl1.place(
            relx=.5, rely=1, anchor="s", height=20, width=800)
        
    def centerWindow(self):
        w = 800
        h = 600
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        x = (sw - w) / 2
        y = (sh - h) / 2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))
        self.parent.resizable(False, False)
        
def main():
    root = Tk()
    global win
    win = Gui(root)
    root.mainloop()
    
if __name__ == '__main__':
    main()

зы вы делаете много очнь странных вещей ..
ззы !!!глобальные переменные это плохая практика!!!
вы можете использовать переменные класса общее для всех экземпляров класса например итд итп
Novator
AD0DE412
не очень понимаю что у вас как и зачем
Да я и сам не очень понимаю, и выйдет ли вообще так, как хотелось бы…
Частично ваш код прояснил ситуацию, теперь хотя бы ясен подход
А вот с этой частью пока не понятно:
Novator
И второй вопрос прямо связан с первым - как получить значение переменной без вызова функции?
В данном случае - получить список “а”, но не писать что-то такое:
a = self.open_file()
Буду пробовать, но наверное не сегодня
PEHDOM
Novator посмотрите вот тут https://www.russianlutheran.org/python/nardo/nardo.html
тутториал хоть и старый(как и ткинтер) но вполне актуальный. там есть примеры как из одного класса в ГУИ обратиться к другому..
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB