2013-09-11 2 views
1

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

Я сначала создать корневое окно в отдельном потоке:

import tkinter as tk 
import threading as th 

class GUI(th.Thread): 
    def __init__(self): 
     th.Thread.__init__(self) 
     self.root = tk.Tk() 
     self.gp = MainFrame(self.root) 

    def start(self): 
     self.root.mainloop() 

    def stop(self): 
     self.root.destroy() 

Конструктор этого класса вызывает конструктор основной рамы:

class MainFrame(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 
     self.x=my_label(self) 
     self.up=my_update(self) 
     self.grid() 

В основной раме, у меня есть только два простых элемента, их класс:

class my_label(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 
     self.l = tk.Label(self,text="some text") 
     self.l.grid() 
     self.grid() 

class my_update(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 

     self.b=tk.Button(self,text="update",command=self.ButtonPushed) 
     self.b.grid() 
     self.grid() 

    def ButtonPushed(self): 
     # here is my problem... 

Выполнение этой работы, но когда я нажимаю на кнопке обновления я хочу изменить xMainFrame). Другими словами, я хочу изменить от ребенка один из детей другого родителя ... как я могу это сделать?

Боковой вопрос: действительно ли общая конструкция моего графического интерфейса правильная? Я имею в виду, правильно ли дать my_update и my_label унаследовать от tk.Frame?

ответ

0

Попробуйте следующее: (см. Комментарий, чтобы увидеть, что я изменил)

class MainFrame(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 
     self.x=my_label(self) 
     self.up=my_update(self, self.x) # <-- pass another child to constructor 
     self.grid() 

class my_label(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 
     self.l = tk.Label(self,text="some text") 
     self.l.grid() 
     self.grid() 

    # my_update.ButtonPushed will call this method. 
    def ButtonPushed(self): 
     self.l['text'] = 'pushed' 

class my_update(tk.Frame): 
    def __init__(self,parent, friend): 
     #      ^^^^^^ 
     # accept another child reference as `freind` as save it as self.friend 
     tk.Frame.__init__(self,parent) 
     self.friend = friend # <-- save reference to another child 

     self.b=tk.Button(self,text="update",command=self.ButtonPushed) 
     self.b.grid() 
     self.grid() 

    def ButtonPushed(self): 
     self.friend.ButtonPushed() # <-- call another child's method freely. 
+0

спасибо, ваш метод работает. но пока я читал ваш ответ, я понял, что концепция моей программы неверна ... поэтому мне не нужно ваше решение. вы все равно помогли мне, показывая мне, что я могу найти лучший способ кодирования! – PinkFloyd

0

Для вашей стороне вопроса: Я не уверен, что еще ваше приложение нужно сделать, так что, может быть, есть веская причина, но мне кажется, что упаковка ярлыка и кнопки в дополнительном классе, который наследует от Frame по сравнению tes вещи немного. Я думаю, что я бы просто сделать:

class MainFrame(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 
     self.x=tk.Label(self, text="some text") 
     self.up=tk.Button(self, text="update", command=self.ButtonPushed) 
     self.x.grid() 
     self.up.grid() 
     self.grid() 

    def ButtonPushed(self): 
     # do something with self.x 

Или, если вам действительно нужны дополнительные занятия, почему бы не иметь дочерние классы наследуют от tk.Label и tk.Button. Никакой реальной необходимости обернуть их в дополнительный фрейм.

Смежные вопросы