Задать вопрос
Lomonos1917
@Lomonos1917
Делаю IRE для предприятия с нуля.

Как использовать переменную из функции внутри класса для работы с другими функциями?

Здравствуйте, я к вам с таким вопросом...

Есть класс "Table", есть в нём функция "CopyTextToClipboard", в этой функции есть переменная "id_num". Переменная категорически важна для дальнейшей работы вне класса и её родной функции. Задача корректно передать эту переменную 1) в функцию (дочернего окна "Win_status()") 2) просто в код (для лейбла). Код, собственно, ниже:
Класс
class Table(tk.Frame):
    def __init__(self, parent=None, headings=tuple(), rows=tuple()):
        super().__init__(parent)
        
        table = ttk.Treeview(self, show="headings", selectmode="browse")
        table["columns"] = headings
        table["displaycolumns"] = headings
  
        for head in headings:
            table.heading(head, text=head, anchor=tk.CENTER)
            table.column(head, anchor=tk.CENTER, width=20)
  
        for row in rows:
            table.insert('', tk.END, values=tuple(row))
        
        table.bind("<ButtonRelease-1>", lambda event, tree = table: self.CopyTextToClipboard(event, tree))
  
        scrolltable = tk.Scrollbar(self, command=table.yview)
        scrolltable1 = tk.Scrollbar(self, command= table.xview)
        table.configure(yscrollcommand=scrolltable.set)
        table.configure(xscrollcommand=scrolltable1.set)
        scrolltable.pack(side=tk.RIGHT, fill=tk.Y)
        scrolltable1.pack(side=tk.BOTTOM, fill=tk.X)
        table.pack(expand=tk.YES, fill=tk.BOTH)

    def CopyTextToClipboard (self, event, tree):
        global id_num
        id_num = tree.item(tree.focus())['values'][0]
        print(id_num)


Функция (в которой надо использовать переменную):
def Win_status ():
    #id_num = Table.CopyTextToClipboard.id_num()
    ws = tk.Toplevel(mwin)
    ws.title('Окно осмотра ТС')
    ws.geometry ('300x650')
    ws.resizable(0,0)
    spec_written = StringVar()
    spec_lbl1 = tk.Label(ws, text='По заявке', fg= 'Black', font='Arial 12 bold')
    spec_lbl1.place(x= 10, y = 10)
    spec_lbl2 = tk.Label(ws,text = id_num, fg= 'Green', font='Complex 12 bold')
    spec_lbl2.place(x= 120, y = 10)
    spec_lbl3 = tk.Label(ws,text='В ходе диагностического осмотра ', fg= 'Black', font='Arial 10')
    spec_lbl3.place(x= 50, y = 35)
    spec_lbl4 = tk.Label(ws,text='были установлены следующие неисправности:', fg= 'Black', font='Arial 10')
    spec_lbl4.place(x= 10, y = 60)
    t_b_desk = tk.Text(ws, width =34, height = 8, bg = 'black', fg = 'white')
    t_b_desk.place(x=10, y= 100)  
    spec_lbl5 = tk.Label(ws,text='ТС установлен статус:', fg= 'Black', font='Arial 10')
    spec_lbl5.place(x= 70, y = 250)
    spec_com = ttk.Combobox(ws, width=32, height=4, font= 'Arial 11', values= ['Обслуживается -- не требует зпч',
                                                                               'Обслуживается -- требует зпч', 
                                                                                'Отложен с правом выезда',
                                                                                'Отложен без права выезда'
                                                                                ])
    spec_com.place(x=10, y=280 )
    cpec_bt = tk.Button(ws, text='Дополнить заявку', bg= 'Green', fg= 'White', width=50)
    cpec_bt.pack(side= tk.BOTTOM, fill= tk.BOTH, pady=10, padx=5)
    spec_lbl6 = tk.Label(ws, text='специалистами АРМ \n проведены следующие работы:', font= 'Arial 10')
    spec_lbl6.place(x= 50, y= 320)
    spec_text = tk.Text (ws, width=34, height= 8, bg= 'black', fg= 'white')
    spec_text.place(x= 10, y= 380)
    spec_lbl7 = tk.Label(ws, text='Ответственный специалист:', font= 'Arial 12 bold')
    spec_lbl7.place(x= 20, y= 520)
    spec_entr = tk.Entry(ws,  textvariable= spec_written, width = 33,  font = ('Arial',  '11', 'bold')) 
    spec_entr.place(x=10 , y= 550)


Ну и лейбл в самом коде, для которого тоже нужна эта переменная:
fra_s = tk.Frame(mwin, width=200, height=30, bg= '#708090')
fra_s.place(x=1250,y=20)
lbl_num = Label(fra_s, text= id_num, fg= 'Green', font='Arial 12 bold' ).pack()


P/S.
Я уверенно догадываюсь, что это несколько противоречит принципам ООП и обычным return это не сделать. Но, как я понял, сделать это можно - а мне это просто необходимо.
  • Вопрос задан
  • 768 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
я думую вы хотите пользоватся переменной в другим функциях. надо сделать её глобальной надо вызвать за пределы функции потом в функции приписать global "имя переменной"
d = 12
def de():
    global d
    d-=2
    print(d)
de()
Ответ написан
@res2001
Developer, ex-admin
У вас эта переменная уже объявлена глобальной в CopyTextToClipboard global id_num. Сделайте такое же объявление во всех необходимых местах и используйте. И объявите эту переменную явно в глобальной области видимости.
это несколько противоречит принципам ООП

Не то что бы. Нужно больше информации об архитектуре приложения чтоб делать такие выводы.
Можно вместо глобальной переменной сделать возврат значения из функции, или сделать эту переменную членом класса и сделать getter для получения значения переменной, и т.д. и т.п. Но за вас выбрать подходящий вариант никто не сможет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы