我在 Windows 上遇到线程和 PyGTK 问题。据PyGTK FAQ (以及我自己的实验),从子线程可靠地更新 GUI 的唯一方法是使用 gobject.idle_add 函数。但是,无法保证何时调用此函数。我如何保证 gobject.idle_add 之后的行在它指向的函数之后被调用?
非常简单和做作的例子:
import gtk
import gobject
from threading import Thread<br/>
class Gui(object):
def __init__(self):
self.button = gtk.Button("Click")
self.button.connect("clicked", self.onButtonClicked)
self.textEntry = gtk.Entry()
self.content = gtk.HBox()
self.content.pack_start(self.button)
self.content.pack_start(self.textEntry)
self.window = gtk.Window()
self.window.connect("destroy", self.quit)
self.window.add(self.content)
self.window.show_all()<br/>
def onButtonClicked(self, button):
Thread(target=self.startThread).start()<br/>
def startThread(self):
#I want these next 2 lines to run in order
gobject.idle_add(self.updateText)
print self.textEntry.get_text()<br/>
def updateText(self):
self.textEntry.set_text("Hello!")<br/>
def quit(self, widget):
gtk.main_quit()<p></p>
<p>gobject.threads_init()
x = Gui()
gtk.main()</p>
最佳答案
不要尝试从线程更新或访问您的 GUI。你只是在自找麻烦。例如,“get_text”在一个线程中完全工作的事实几乎是一个意外。您可能能够在 GTK 中依赖它 - 虽然我什至不确定 - 但您将无法在其他 GUI 工具包中这样做。
如果您确实需要在线程中做一些事情,您应该在启动线程之前从 GUI 获取所需的数据,然后使用 idle_add 从线程更新 GUI ,像这样:
import time
import gtk
import gobject
from threading import Thread
w = gtk.Window()
h = gtk.HBox()
v = gtk.VBox()
addend1 = gtk.Entry()
h.add(addend1)
h.add(gtk.Label(" + "))
addend2 = gtk.Entry()
h.add(addend2)
h.add(gtk.Label(" = "))
summation = gtk.Entry()
summation.set_text("?")
summation.set_editable(False)
h.add(summation)
v.add(h)
progress = gtk.ProgressBar()
v.add(progress)
b = gtk.Button("Do It")
v.add(b)
w.add(v)
status = gtk.Statusbar()
v.add(status)
w.show_all()
def hardWork(a1, a2):
messages = ["Doing the hard work to add %s to %s..." % (a1, a2),
"Oof, I'm working so hard...",
"Almost done..."]
for index, message in enumerate(messages):
fraction = index / float(len(messages))
gobject.idle_add(progress.set_fraction, fraction)
gobject.idle_add(status.push, 4321, message)
time.sleep(1)
result = a1 + a2
gobject.idle_add(summation.set_text, str(result))
gobject.idle_add(status.push, 4321, "Done!")
gobject.idle_add(progress.set_fraction, 1.0)
def addthem(*ignored):
a1 = int(addend1.get_text())
a2 = int(addend2.get_text())
Thread(target=lambda : hardWork(a1, a2)).start()
b.connect("clicked", addthem)
gtk.gdk.threads_init()
gtk.main()
如果你真的,绝对需要在线程中间从 GUI 读取数据(这是一个非常糟糕的主意,不要这样做 - 你可能会陷入非常令人惊讶的死锁,尤其是当程序关闭时) Twisted 中有一个实用程序,blockingCallFromThread ,这将为您完成艰苦的工作。你可以像这样使用它:
from twisted.internet.gtk2reactor import install
install()
from twisted.internet import reactor
from twisted.internet.threads import blockingCallFromThread
from threading import Thread
import gtk
w = gtk.Window()
v = gtk.VBox()
e = gtk.Entry()
b = gtk.Button("Get Text")
v.add(e)
v.add(b)
w.add(v)
def inThread():
print 'Getting value'
textValue = blockingCallFromThread(reactor, e.get_text)
print 'Got it!', repr(textValue)
def kickOffThread(*ignored):
Thread(target=inThread).start()
b.connect("clicked", kickOffThread)
w.show_all()
reactor.run()
如果你想看看魔法是如何运作的,你可以随时read the source .
关于python - Windows 上线程和 PyGTK 的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1008322/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o