Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';确定tkinter UI类属性是否已从外部模块更改的最佳方法是什么?_Python_Multithreading_Tkinter_Module - Fatal编程技术网

Python 什么';确定tkinter UI类属性是否已从外部模块更改的最佳方法是什么?

Python 什么';确定tkinter UI类属性是否已从外部模块更改的最佳方法是什么?,python,multithreading,tkinter,module,Python,Multithreading,Tkinter,Module,我目前正在开发一个模块化的神经网络程序,它有一个Tkinter用户界面模块、一个神经网络模块和一个允许两者通信的“主”模块 问题是,我需要从UI类属性中检索网络参数列表(以便实例化神经网络类),但只有在更新之后(通过用户与小部件的交互)才需要 基于parameters=[]是否运行的while循环是不可行的,因为据我所知,在没有多线程的情况下无法同时更新窗口,但Tkinter不是线程安全的 对于任何技术上的错误,我深表歉意,我对编程和它的术语还比较陌生 UI.py train = Button(

我目前正在开发一个模块化的神经网络程序,它有一个Tkinter用户界面模块、一个神经网络模块和一个允许两者通信的“主”模块

问题是,我需要从UI类属性中检索网络参数列表(以便实例化神经网络类),但只有在更新之后(通过用户与小部件的交互)才需要

基于
parameters=[]
是否运行的while循环是不可行的,因为据我所知,在没有多线程的情况下无法同时更新窗口,但Tkinter不是线程安全的

对于任何技术上的错误,我深表歉意,我对编程和它的术语还比较陌生

UI.py

train = Button(self.parameterframe, text="Train", command=lambda: self.train())
        train.place(x=257, y=150)

    def train(self):

        parameters = [self.epochs.get(), self.layer1neurons.get(),
                      self.layer2neurons.get(), self.batchsize.get(),
                      self.learningrate.get()]

        for p in parameters:

            try:

                if p == self.learningrate.get():
                    float(p)
                else:
                    int(p)

            except ValueError:

                messagebox.showerror(title="Error", message="Please ensure that all parameters are of the correct type.")
                return

        self.parameters = parameters
def refresh():
    root = Tk()
    interface = UI.create_ui(root)
    while True:
        root.update()
        time.sleep(0.1)

thread = thread.Thread(target=refresh())
thread.start()

#Then a while  loop for retrieving parameters followed by a .join() statement.
Main.py

train = Button(self.parameterframe, text="Train", command=lambda: self.train())
        train.place(x=257, y=150)

    def train(self):

        parameters = [self.epochs.get(), self.layer1neurons.get(),
                      self.layer2neurons.get(), self.batchsize.get(),
                      self.learningrate.get()]

        for p in parameters:

            try:

                if p == self.learningrate.get():
                    float(p)
                else:
                    int(p)

            except ValueError:

                messagebox.showerror(title="Error", message="Please ensure that all parameters are of the correct type.")
                return

        self.parameters = parameters
def refresh():
    root = Tk()
    interface = UI.create_ui(root)
    while True:
        root.update()
        time.sleep(0.1)

thread = thread.Thread(target=refresh())
thread.start()

#Then a while  loop for retrieving parameters followed by a .join() statement.

请注意,上面的代码纯粹是实验性的,只是让您了解我想要实现的目标。

您能提供一个简单的示例来说明您想要做什么吗?现在还不清楚“UI类属性已经设置”是什么意思——你是在问改变字体或颜色的事情吗?或者,您是否在询问他们何时更改条目小部件中的值或画布上的对象等?Tkinter不具有线程安全性并不意味着您不能使用线程-它只是意味着所有使用和与它的交互必须仅在其中一个线程中进行。这通常是主线程,但不一定是。线程可以通过
队列
或共享的全局资源相互通信(如果采取措施确保不能同时访问它们)。@BryanOakley澄清一下,我的意思是当
self.parameters
通过输入条目小部件将值从空列表更改为有效参数列表时。因此,不是widget属性,而是自定义类的自定义属性?@martineau我知道这一点,但是,我正在努力找到一种方法来将它们用于我想要的目的。如果不通过
root.update()
更新窗口,就不可能将参数输入到条目窗口小部件中,但所有Tkinter逻辑似乎都需要约束到主线程,因此我似乎无法在不同的线程中检索参数。当然,这至少需要两个线程,并且都依赖于某种形式的Tkinter逻辑?您能提供一个您尝试执行的最小示例吗?现在还不清楚“UI类属性已经设置”是什么意思——你是在问改变字体或颜色的事情吗?或者,您是否在询问他们何时更改条目小部件中的值或画布上的对象等?Tkinter不具有线程安全性并不意味着您不能使用线程-它只是意味着所有使用和与它的交互必须仅在其中一个线程中进行。这通常是主线程,但不一定是。线程可以通过
队列
或共享的全局资源相互通信(如果采取措施确保不能同时访问它们)。@BryanOakley澄清一下,我的意思是当
self.parameters
通过输入条目小部件将值从空列表更改为有效参数列表时。因此,不是widget属性,而是自定义类的自定义属性?@martineau我知道这一点,但是,我正在努力找到一种方法来将它们用于我想要的目的。如果不通过
root.update()
更新窗口,就不可能将参数输入到条目窗口小部件中,但所有Tkinter逻辑似乎都需要约束到主线程,因此我似乎无法在不同的线程中检索参数。当然,这至少需要两个线程,并且都依赖于某种形式的Tkinter逻辑?