问题标签 [mainloop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
56 浏览

python - wxPython MainLoop() 崩溃

有时,当我运行项目时,我的 MainLoop 崩溃并且我得到一个退出代码。我不知道如何调试代码并查看导致它崩溃的行在哪里。我的项目很长,有很多类,所以我不能把它复制到这里。如何找到这条线?

0 投票
1 回答
79 浏览

event-handling - 一个平台的 UI 框架是否为你提供了主循环的行话?

在我上大学的时候,我记得我的一本教科书有专门的术语来区分这两种不同的 API 范例,但是,就我的一生而言,我不记得它在哪本书中,而谷歌也没有帮助。

  • 像 Win32、Xlib 和 SDL 这样的 API,您位于调用堆栈的顶部,必须编写自己的主循环并负责使用GetMessageXNextEventSDL_PollEvent.

    (这种设计需要更多技巧,但可以最大限度地控制编写游戏引擎或需要在 Win32 的 Win16 祖先设计的 80286 CPU 上运行的资源受限应用程序。)

  • 像 Qt、GTK、wxWidgets、Fltk、Swing、Tk 等 API,您可以在其中执行一些初始化、连接事件处理程序,并且框架为您提供事件循环,方法是生成后台线程或要求您明确地将控制权转移到框架。(例如QApplication.exec(), gtk_main(), IMPLEMENT_APP(wxAppSubclass),Fl::run()等)

有谁知道我很难记住哪两个术语?

请记住,这不是即时模式与保留模式。可能有一个保留模式应用程序,您仍然必须自己泵送事件循环,或者有一个即时模式应用程序,您可以在从平台提供的主循环分派的回调中进行绘图。

0 投票
1 回答
44 浏览

python - 带有 Tkinter 的基本窗口,mainloop()

我对 Python 很陌生,目前正在学习如何使用 Tkinter 创建基本窗口。

Python 文档建议使用以下代码(简化):

另一方面,我看过一些关于这个主题的教程,建议使用

正确的使用方法是mainloop()什么?如果两者都正确,最好使用什么?

0 投票
0 回答
52 浏览

python - 如何在所有小部件调整大小操作后对任务进行排队?

我想在更改其内容后查询小部件的大小。这是一个演示:

根据文档after_idle,只有在无事可做时才应执行排队的回调:

注册一个在系统空闲时调用的回调。回调将被调用,主循环中不再有要处理的事件。

然而,callback2显然是在调整标签大小之前执行的,因为程序的输出是这样的:

即使添加调用update_idletasks()也不会更改此输出。仅当在和中win.update_idletasks()调用时,才会打印正确的尺寸。我真的不明白为什么有必要调用它两次。 callback1 callback2

问题

为什么callback2在调整标签大小之前执行?如何确保label.winfo_width()返回正确的尺寸?

限制

这个问题的主要目标是了解 tkinter 如何/何时执行(空闲)任务。我想了解如何正确地对任务进行排队,以便仅在 GUI 自行更新后才执行它们。我对诸如以下的解决方法并不感兴趣:

  • 我宁愿避免使用update(),因为我不明白它如何导致竞争条件或何时可以安全使用。(在我的真实代码中,所有这些都将在事件处理程序中执行,文档明确指出应该避免这种情况。)
  • 我也想避免使用<Configure>event。这是因为可能有任意数量的小部件在改变大小,并且不能合理地期望我将事件处理程序绑定到它们的所有<Configure>事件。在所有调整大小发生后,我真的只需要一种方法来执行回调函数。
0 投票
1 回答
35 浏览

python - 使用大量使用 tkinter python 的 MainLoop

所以我在学校做一个项目,我正在用 Tkinter 制作一个游戏(我知道我可以使用 PyGame,但我们在学校只学过 Tkinter....)我的游戏也使用套接字,你可能知道一次代码卡在接收整个程序冻结。为了解决这个问题,我所做的是大多数时候我从服务器接收一些东西,我是在一个线程中做的。但是由于没有服务器的回答我无法继续前进,所以我调用了 MainLoop,所以程序将“停止”它,一旦我从客户端获得信息,我就销毁了 MainLoop 并继续我需要的地方......我的问题是它是否可以这样做,如果没有,请帮助我以“好”的方式解决这个问题。

它看起来像这样:

0 投票
2 回答
91 浏览

python - 如何更新全局计数器

我正在尝试在 tkinter 中实现一个计数器。每当我单击任何按钮时,我都希望它+1。但是,计数器值始终保持不变。这是我的示例代码:

我实际上尝试将 Count+=1 放在很多地方,但没有一个奏效。所以我猜问题是 Count 的值会在每个循环(mainloop())中重置为 0。对tkinter不太熟悉。我最终想用这个计数器做的是每次按下按钮时更新窗口中显示的“对话”(标签和按钮)。按下不同的按钮应该会产生不同的对话(比如那种文字游戏)。谁能帮我解决这个问题?

0 投票
1 回答
178 浏览

qemu - 如何让QEMU一次只执行一条指令返回主循环?

我在QEMU源文件编译选项中添加了-fPCI,在最后的链接命令中添加了-shared,这样QEMU就变成了一个可以动态加载的共享库。从那时起,我开始尝试了解 QEMU。我使用 dlopen 动态加载 qemu 并使用 dlsym 搜索 qemu 中的函数。这是我的代码:

程序的输出如下:

我为 QEMU 的主循环建模并编写了这个 while 循环。我每次循环打印获取的数据,发现icount_raw可以表示CPU当前执行的指令数。关于其他数据,我仍然感到困惑。本程序运行时,uboot程序可以正常运行。我发现屏幕上打印数据的频率大约是每秒一次。每次 icount_raw 增加很多。当我使用gdb远程控制程序运行时,使用“si”命令时,icount_raw每次递增1,这就是我想要实现的:每次QEMU只执行一条指令,就可以返回主循环. 我想知道如何修改QEMU的代码,让QEMU每次执行一条指令时,都能返回到主循环,而不是使用gdb的“si”命令。以后想知道每次执行N条指令后如何控制QEMU返回主循环。这个N我可以自由设置。我了解QEMU的事件循环是基于Glib的,我想我的问题可能需要修改QEMU中调用Glib的代码。

0 投票
2 回答
381 浏览

python - 使用 Python 和 Tkinter,我将如何在 .mainloop() 的每个循环中运行代码?

我有一个程序,每次 mainloop() 循环时我都需要移动一个图像对象。我没有尝试做太多,主要是因为我不知道从哪里开始。我制作了一个模拟我遇到的问题的项目的虚拟版本。

总结一下我的问题,我需要运行 mainloop,就好像它不是阻塞函数一样。相反,要么异步运行它,要么暂停它然后运行该函数,尽管我认为这是不可能的。

有什么帮助谢谢

0 投票
1 回答
901 浏览

multithreading - 将每个 GStremer 管道运行到一个单独的 (GLib) 线程中

所有 GStremer 样本都通过以下某种形式初始化 GLib 主线程:

据我了解,这个主循环用于所有信号处理。总线消息也在其中处理。

所以我有点担心如果我同时运行多个管道会发生什么。或者其中一些存在问题/不正确的实现。

对于重负载,最好的解决方案很可能是将管道分离到多个进程,从而减轻内存泄漏、挂起、死锁等所有可能的问题,而不会影响主应用程序。

无论如何,至少将它们运行到单独的线程中是有益的。

显然,可以启动多个 GLib 主线程,首先创建 GMainContext。但我无法理解(显然我缺少知识)之后如何将它们“分配”给管道或向它们发出信号等。例如在“g_signal_connect”和“g_signal_emit”中没有指定哪个“主”线程是执行。

这里的一些帖子声称这是可能的(GStreamer 支持不同的主线程),但我无法找到详细信息。

在这个线程中讨论了类似的问题,但老实说我无法理解它。

这篇StackOverflow 帖子中讨论了如何将超时附加到不同的 GLib 主线程。我想可以为 GStreamer 管道和对象制作类似的东西,但我不确定。

有人可以启发我一点吗?

0 投票
1 回答
177 浏览

python - pyautogui 和 tkinter 中的确认和主循环

我正在寻找可以在 Tkinter 小部件中使用 x 值的方法。我无法从网上找到合适的答案。任何建议表示赞赏。谢谢


关于,确认,它返回 x 并且 print(x) 有效。


如果我在 root.mainloop() 上方添加 print(x),Python 会抛出一个错误,说名称“x”虽然是全局的,但没有定义。如果我在 root.mainloop() 下添加 print(x),它就可以工作。

但是,我想在 tkinter 小部件中使用 x 值(Z2 037 或 Z2 039)。有没有办法做到这一点?