Python 如何使用tkinter的widget.config()修改由相同方法创建的单独小部件?

Python 如何使用tkinter的widget.config()修改由相同方法创建的单独小部件?,python,widget,tkinter,config,Python,Widget,Tkinter,Config,我对Python很陌生。我可以让事情顺利进行,但我从来都不确定我是否真的在使用最佳实践,所以请原谅我没有正确解释,或者我的代码没有使用最佳实践编写。我正在努力 我想知道如何使用tkinter的widget.config来修改由相同方法创建的单独的widget?例如,在下面的代码中,如何使用widget.config修改结果部分2中的文本,r2 from tkinter import * from tkinter.ttk import * class App(): def __init_

我对Python很陌生。我可以让事情顺利进行,但我从来都不确定我是否真的在使用最佳实践,所以请原谅我没有正确解释,或者我的代码没有使用最佳实践编写。我正在努力

我想知道如何使用tkinter的widget.config来修改由相同方法创建的单独的widget?例如,在下面的代码中,如何使用widget.config修改结果部分2中的文本,r2

from tkinter import *
from tkinter.ttk import *

class App():
    def __init__(self, master):
        self.master = master
        self.master.title('Question')
        self.create_main_frame()  

    def create_main_frame(self):
        self.main_f = Frame(self.master)
        nb = Notebook(padding=5)
        nb.pack(anchor='w')
        self.tab1(nb)

    def tab1(self, nb):
        tab1_frame = Frame(nb)
        nb.add(tab1_frame, text='Tab 1', underline=0)

        prod_lab = Label(tab1_frame, text='Entry:')
        prod_lab.grid(row=1, column=0, padx=(10,0), pady=(10,5), sticky='e')

        self.product_e = Entry(tab1_frame, width=40)
        self.product_e.grid(row=1, column=1, padx=(0,10), pady=(10,5))

        self.button1 = Button(tab1_frame,
                               text="Run",
                               command=self.run1
                               )
        self.button1.grid(row=2, column=1, padx=(0,10), pady=(0,10), sticky='ne')


        self.results1 = self.create_result(tab1_frame, 'Results Section 1')
        self.results2 = self.create_result(tab1_frame, 'Results Section 2')
        self.results3 = self.create_result(tab1_frame, 'Results Section 3')

    def create_result(self, frame, name):
        lab_frame = LabelFrame(master=frame, text=name)
        lab_frame.grid(sticky='we', padx=10, pady=10, columnspan=10)

        l1 = Label(master=lab_frame, text='Result 1:')
        l1.grid(sticky='e', row=0, column=0, pady=2)

        l2 = Label(master=lab_frame, text='Result 2:')
        l2.grid(sticky='e', row=1, column=0, pady=2)

        l3 = Label(master=lab_frame, text='Result 3:')
        l3.grid(sticky='e', row=2, column=0, pady=2)

        r1 = Label(master=lab_frame, text='')
        r1.grid(sticky='w', row=0, column=1, pady=2)

        r2 = Label(master=lab_frame, text='')
        r2.grid(sticky='w', row=1, column=1, pady=2)

        r3 = Label(master=lab_frame, text='')
        r3.grid(sticky='w', row=2, column=1, pady=2)

    def run1(self):
        #This is the method that will be used to find the results I need
        #For the sake of this question, let's pretend I want to put whatever text is in Entry 1, into results section 2 result 2
        print (self.product_e.get())
        print ('How do I use "widget.config()" to modify the 3 results sections separately???')

master = Tk()
app = App(master)
master.mainloop()

非常感谢您的帮助

我的Tkinter不好,所以我会把create_结果改成class结果


这很有效。很明显,我不完全理解什么时候使用新类,什么时候使用类内的方法,什么时候使用类外的函数。需要做一些阅读!作为后续问题,是否有办法在整个方法完成之前返回results2.r2.config?在这种情况下,这并不重要,但如果每个结果集花费20秒,最好在GUI完成时用每个结果填充它,而不是等待整个方法完成。我认为这是必需的线程-第二个线程可以在后台做一些事情,然后它必须将结果发送到主线程,因为只有主线程可以使用GUI。您可以有多个线程-每个结果集一个线程。但线程更复杂。@布赖恩·奥克利。你有什么建议?你有示例代码吗?@furas:没有足够的数据来回答这个问题。这完全取决于为什么每个结果集需要20秒,以及是否可以将结果分成更小的块,或者是否可以作为单独的进程运行。在任何一种情况下,这都不能在评论框中得到回答——它应该有自己的问题。在这个网站上已经有这样的问题了。
from Tkinter import *
from ttk import *

class Results():

    def __init__(self, frame, name):
        self.lab_frame = LabelFrame(master=frame, text=name)
        self.lab_frame.grid(sticky='we', padx=10, pady=10, columnspan=10)

        self.l1 = Label(master=self.lab_frame, text='Result 1:')
        self.l1.grid(sticky='e', row=0, column=0, pady=2)

        self.l2 = Label(master=self.lab_frame, text='Result 2:')
        self.l2.grid(sticky='e', row=1, column=0, pady=2)

        self.l3 = Label(master=self.lab_frame, text='Result 3:')
        self.l3.grid(sticky='e', row=2, column=0, pady=2)

        self.r1 = Label(master=self.lab_frame, text='')
        self.r1.grid(sticky='w', row=0, column=1, pady=2)

        self.r2 = Label(master=self.lab_frame, text='')
        self.r2.grid(sticky='w', row=1, column=1, pady=2)

        self.r3 = Label(master=self.lab_frame, text='')
        self.r3.grid(sticky='w', row=2, column=1, pady=2)

class App():
    def __init__(self, master):
        self.master = master
        self.master.title('Question')
        self.create_main_frame()  

    def create_main_frame(self):
        self.main_f = Frame(self.master)
        nb = Notebook(padding=5)
        nb.pack(anchor='w')
        self.tab1(nb)

    def tab1(self, nb):
        tab1_frame = Frame(nb)
        nb.add(tab1_frame, text='Tab 1', underline=0)

        prod_lab = Label(tab1_frame, text='Entry:')
        prod_lab.grid(row=1, column=0, padx=(10,0), pady=(10,5), sticky='e')

        self.product_e = Entry(tab1_frame, width=40)
        self.product_e.grid(row=1, column=1, padx=(0,10), pady=(10,5))

        self.button1 = Button(tab1_frame,
                               text="Run",
                               command=self.run1
                               )
        self.button1.grid(row=2, column=1, padx=(0,10), pady=(0,10), sticky='ne')


        self.results1 = Results(tab1_frame, 'Results Section 1')
        self.results2 = Results(tab1_frame, 'Results Section 2')
        self.results3 = Results(tab1_frame, 'Results Section 3')


    def run1(self):
        #This is the method that will be used to find the results I need
        #For the sake of this question, let's pretend I want to put whatever text is in Entry 1, into results section 2 result 2
        print (self.product_e.get())
        print ('How do I use "widget.config()" to modify the 3 results sections separately???')
        self.results1.r2.config(text='1111111111')
        self.results2.r2.config(text='xxxxxxxxxx')
        self.results3.r2.config(text='----------')

master = Tk()
app = App(master)
master.mainloop()