Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Как изменить метку с другого класса [RSS Feed]

#1 Март 22, 2021 18:12:26

Novator
Зарегистрирован: 2021-03-22
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить метку с другого класса

Приветствую!
Подскажите, как изменить метку с другого класса? Как к ней обратиться для изменения ее свойств?
Код примерно такой (обрезан от всего лишнего):

 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()
У меня просто в зависимости от переданного параметра генерируется разный список, и получается, что три раза вызывается эта функция с диалоговым окном открытия файла. А так бы - я раз открыл файл, и потом обрабатывал уже саму переменную.

Офлайн

#2 Март 23, 2021 19:09:56

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 870
Репутация: +  39  -
Профиль   Отправить e-mail  

Как изменить метку с другого класса

не очень понимаю что у вас как и зачем но вот код для примера

 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()

зы вы делаете много очнь странных вещей ..
ззы !!!глобальные переменные это плохая практика!!!
вы можете использовать переменные класса общее для всех экземпляров класса например итд итп



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

есчщо

Отредактировано AD0DE412 (Март 23, 2021 19:22:29)

Офлайн

#3 Март 23, 2021 20:16:13

Novator
Зарегистрирован: 2021-03-22
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить метку с другого класса

AD0DE412
не очень понимаю что у вас как и зачем
Да я и сам не очень понимаю, и выйдет ли вообще так, как хотелось бы…
Частично ваш код прояснил ситуацию, теперь хотя бы ясен подход
А вот с этой частью пока не понятно:
Novator
И второй вопрос прямо связан с первым - как получить значение переменной без вызова функции?
В данном случае - получить список “а”, но не писать что-то такое:
a = self.open_file()
Буду пробовать, но наверное не сегодня

Офлайн

#4 Март 24, 2021 11:44:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2177
Репутация: +  293  -
Профиль   Отправить e-mail  

Как изменить метку с другого класса

Novator посмотрите вот тут https://www.russianlutheran.org/python/nardo/nardo.html
тутториал хоть и старый(как и ткинтер) но вполне актуальный. там есть примеры как из одного класса в ГУИ обратиться к другому..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

  • Начало
  • » GUI
  • » Как изменить метку с другого класса[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version