Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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 蟒蛇3,了解;“图形用户界面循环”;如tkinter-mainloop()或QtPy-exec_u2;()中所示_Python_Qt_Tkinter_Python 3.5 - Fatal编程技术网

Python 蟒蛇3,了解;“图形用户界面循环”;如tkinter-mainloop()或QtPy-exec_u2;()中所示

Python 蟒蛇3,了解;“图形用户界面循环”;如tkinter-mainloop()或QtPy-exec_u2;()中所示,python,qt,tkinter,python-3.5,Python,Qt,Tkinter,Python 3.5,3个子问题: [1] python GUI是基于轮询的吗 在我看来,tk和qtpy都是基于轮询的,如果gui调用的函数需要一段时间才能执行,那么整个gui都会挂起 很久以前我就了解了gui,我记得现代gui应该是基于中断的,即使当gui执行一些大的操作时,gui也应该始终具有响应性。gui可能不会显示这些大型计算的结果,但它会响应调整大小、显示按钮单击动画等。因此,我的问题是,是否有如下选项: #psuedo code root=tkinter.Tk() root.set

3个子问题:
[1] python GUI是基于轮询的吗
在我看来,tk和qtpy都是基于轮询的,如果gui调用的函数需要一段时间才能执行,那么整个gui都会挂起
很久以前我就了解了gui,我记得现代gui应该是基于中断的,即使当gui执行一些大的操作时,gui也应该始终具有响应性。gui可能不会显示这些大型计算的结果,但它会响应调整大小、显示按钮单击动画等。因此,我的问题是,是否有如下选项:

    #psuedo code
    root=tkinter.Tk()
    root.setInterruptMode(True)
[2] tk.mainloop()只是一个巨大的循环吗
如果我的第一个问题是白日梦,我只需要学习线程和多进程,那么我的下一个问题是关于
root.mainloop()
(或qtpy的
exec\(

我的印象是mainloop()并没有真正启动python中的线程或任何东西,它只是将一个巨大而不可见的tkinter的gui轮询+绘制循环打包到我的主线中。我的印象正确吗

[3] 为什么把主回路放在主线上
mainloop()
是否必须驻留在主线中?我可以线程/多处理它吗?因此,我的主线可以专注于大型计算,主线管理gui进程和IO进程。我遇到的所有示例在主线中都有
mainloop()
,我不确定这是一种推荐的方法,也不确定它有什么好处

下面是我在尝试学习python gui时编写的代码:

    import tkinter
    import random

    class myGUI():
        def __init__(self, arg_tkroot):
            self.GUI_display = tkinter.Label(arg_tkroot, text='init-ed')
            self.GUI_button = tkinter.Button(arg_tkroot, text='click')
            self.GUI_display.pack()
            self.GUI_button.pack()

            self.GUI_button.bind('<Button-1>', self.handle_user_interaction)
            self.list_bigData = []

        #handles GUI interaction, and call bigData_and_bigCalculation()
        def handle_user_interaction(self, arg_event):
            print(arg_event, ' detected by myGUI')
            strResult_toFeedbackToUser = self.bigData_and_bigCalculation()
            self.GUI_display.config(text=strResult_toFeedbackToUser)
            print('finished handling user interact')

        # slow calculations and memory consuming operations
        def bigData_and_bigCalculation(self):
            self.list_bigData[:]=[]
            for i in range(500000):
                self.list_bigData.append( ''.join(random.choice('asdfas') for k in range(10)) )
            return self.list_bigData[-1]
    # Main()
    if __name__ == '__main__':
        root = tkinter.Tk()
        mygui = myGUI(root)
        root.mainloop()
导入tkinter
随机输入
类myGUI():
定义初始化(self,arg\u tkroot):
self.GUI\u display=tkinter.Label(arg\u tkroot,text='init-ed')
self.GUI\u button=tkinter.button(arg\u tkroot,text='click')
self.GUI_display.pack()
self.GUI_button.pack()
self.GUI\u按钮.bind(“”,self.handle\u用户交互)
self.list_bigData=[]
#处理GUI交互,并调用bigData_和_bigCalculation()
def句柄用户交互(自身、arg事件):
打印(arg_事件,“由myGUI检测到”)
strResult_toFeedbackToUser=self.bigData_和_bigcluation()
self.GUI\u display.config(text=strResult\u tofeedbacktoser)
打印('已完成处理用户交互')
#计算速度慢和占用内存的操作
def bigData_和_bigcountation(self):
self.list_bigData[:]=[]
对于范围内的i(500000):
self.list_bigData.append(“”.join(random.choice('asdfas')表示范围(10)中的k)
返回self.list_bigData[-1]
#Main()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tkinter.Tk()
mygui=mygui(根目录)
root.mainloop()
[1] GUI是基于轮询的吗

GUI是基于事件的——GUI中发生的一切都是对事件的响应。应用程序如何处理事件取决于应用程序。如果事件的处理可以在几百毫秒或更短的时间内发生,那么它可以在主线程中处理。如果需要更长的时间,应用程序应该在单独的线程或进程中运行代码

对于Tkinter,Tkinter设计为在单个线程中运行。这并不意味着不能使用线程,只是对tkinter对象的所有访问都应该在一个线程上。通常的方法是其他线程通过线程安全队列与GUI通信,GUI线程负责定期检查该队列

所以我的问题是,有没有像[
root.setInterruptMode(True)
]

在tkinter中,没有,无法进入特殊的“中断”模式

[2] 这只是一个巨大的环

我假设“it”是指对
mainloop
的调用。是的,这是一个巨大的环。或者更准确地说,这是一个小循环。它所做的只是等待一个事件,然后查找事件的处理程序并运行该处理程序

我的印象是mainloop()并没有真正启动python中的线程或任何东西

对。它在当前线程中运行事件循环

[3] 为什么把主回路放在主线上

您必须询问原始开发人员这一点。很可能是因为这是非常非常大比例的应用程序所需要的全部(也许在工具包发明时比现在更真实)

Tkinter只是tcl解释器的包装器,解释器中加载了tk工具包。tcl/tk被设计为嵌入到其他应用程序中,因此它需要是轻量级的,并且能够在不支持线程的系统上运行(tcl已经足够老了,不能保证在每个平台上都支持线程)

mainloop()必须驻留在主线中吗?我可以线程/多处理它吗

mainloop()
需要在创建根窗口的同一线程中运行。如果您需要线程(而且很可能不需要),您当然可以在单独的线程中运行事件处理程序。它增加了复杂性,但如果你需要它,它就在那里。对于一大类程序,根本不需要那么复杂

您应该能够创建工作线程,并从那里创建和运行GUI。我从未试过,但我看不出有什么理由不起作用。Tkinter不在乎它是主线程,只在乎所有Tkinter代码都在同一个线程中运行

我遇到的所有示例的主线都有mainloop(),我不确定这是一种推荐的方法,也不确定它有什么好处


在主线程中调用
mainloop
,是tkinter的工作原理。如果您有长时间运行的计算,您应该将这些计算放在一个单独的线程或进程中。

好吧,如果您要在GUI线程中执行一些长任务,那么GUI将冻结。为了避免这种情况,为di生成不同的线程