- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
基于类,我有一个包含 button
和 progressbar
的窗口,只要单击按钮,就会发生两件事:
1 - should entried value from dialog pass to
class ABCD
2 - While our class
ABCD()
do his stuff, should our progressbar do regular pulsing untill the class ABCD() finish process.
所以问题是进度条只跳动一次,然后卡在那里直到 ABCD() 类完成,然后它开始有规律地跳动。
这是我的尝试:
import gi,time
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject
class DialogExample(Gtk.Dialog):
def __init__(self, parent):
Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK))
self.set_default_size(150, 100)
self.Myinput = Gtk.Entry()
box = self.get_content_area()
box.add(self.Myinput)
self.show_all()
class DialogWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Dialog Example")
self.set_border_width(6)
Hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.add(Hbox)
self.button = Gtk.Button("Open dialog")
self.button.connect("clicked", self.on_button_clicked)
Hbox.pack_start(self.button, True, True, 0)
self.progressbar = Gtk.ProgressBar()
Hbox.pack_start(self.progressbar, True, True, 0)
#~~~~~~ Progress Bar
def on_timeout(self, user_data):
"""
Update value on the progress bar
"""
if self.activity_mode:
self.progressbar.pulse()
else:
new_value = self.progressbar.get_fraction() + 0.01
if new_value > 1:
new_value = 0
self.progressbar.set_fraction(new_value)
# As this is a timeout function, return True so that it
# continues to get called
return True
def on_button_clicked(self, widget):
dialog = DialogExample(self)
response = dialog.run()
if response == Gtk.ResponseType.OK:
variable = dialog.Myinput.get_text()
print("start")
dialog.destroy()
#ProgressBar time function
self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)
self.activity_mode = False
self.progressbar.pulse()
#this for Updating the Windows and make the progressbar pulsing while waiting
# the class ABCD finish his stuff, finally should stop pulsing.
while Gtk.events_pending():
Gtk.main_iteration_do(False)
passing_instance = ABCD(variable)
class ABCD(object):
def __init__(self,value_of_dialog):
self.get_value = value_of_dialog
self.for_add = "______ add was done"
self.final_value = self.get_value+self.for_add
time.sleep(10)
print("gonna be finished")
print(self.final_value)
win = DialogWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
正如我们在这里看到的,我已经尝试在这部分代码中生成脉冲并刷新窗口
self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)
self.activity_mode = False
self.progressbar.pulse()
#this for Updating the Windows and make the progressbar pulsing while waiting
# the class ABCD finish his stuff, finally should stop pulsing.
while Gtk.events_pending():
Gtk.main_iteration_do(False)
Otherwise because in
my class ABCD()
i havetime.sleep(10)
should the progress bar pulse only for that time 10 seconds later only then stop.
这段代码应该如何编写,我需要有人向我提供正确的代码,并且几乎没有解释。
最佳答案
使用 sleep
来模拟时间流逝的问题是 sleep
会停止线程中发生的一切,在这种情况下会阻止线程到达 Gtk.main()
使你的进度条脉动或更新。
因此,为了正确执行此操作,有 2 个选项:
在单独的线程中运行ABCD
,这样主线程就可以到达Gtk.main()
。这将确保进度条按预期移动。一个简单的例子如下所示:
self.abcd_thread = ABCD(variable)
self.abcd_thread.start()
class ABCD(Thread):
def __init__(self, value_of_dialog):
super(ABCD, self).__init__()
self.get_value = value_of_dialog
self.for_add = "______ add was done"
self.final_value = self.get_value+self.for_add
def run(self):
print "Starting " + self.name
time.sleep(10)
print("gonna be finished")
print(self.final_value)
print "Exiting " + self.name
使用它时,您可以使用 self.abcd_thread.isAlive()
查看线程是否仍在计算。返回信息的方式在很大程度上取决于线程中放置的作业。
将 time.sleep
替换为以下片段:
now = time.time()
while time.time() - now < 10:
# Insert any code here
Gtk.main_iteration_do(False)
这仍然会模拟 ABCD
做 10 秒的事情,但是因为我们在循环的每次迭代中调用 Gtk.main_iteration_do(False)
GTK 能够更新界面在循环期间。
一般来说,第二个选项是最简单的,因为它只涉及在你做任何事情时调用 Gtk.main_iteration_do(False)
。另一方面,在处理添加 Gtk 调用不容易适应的复杂计算时,第一个选项更有用。
关于 python ,Gtk3 : How to make the Progress bar pulsing while other stuffs are running,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37292305/
Google 没有帮我解决这个问题。是否有任何理由不执行以下操作: var test = $('something'); $(test).stuff(); 而不是这样做: var test = $('
我最熟悉 Python 和 C,当我在 JS 中看到这种语法时,我真的很困惑 function begin () { console.log("done did it"); } window.
我的输出是正确的,但我想知道 STUFF 的实际工作原理。 我有一个简单的查询,它返回 @startDate 和 @endDate 之间的总月数。 在 STUFF 的帮助下,我将那几个月存储到 @co
这些似乎是等效的: scala> ("asd" zip "zxc").toMap res62: scala.collection.immutable.Map[Char,Char] = Map(a ->
我在一个应用程序上工作,我们使用这个 IEnumerable 扩展: public static bool IsEmpty([NoEnumeration] this IEnumerable sourc
我正在为游戏创建一个元素制作系统,需要能够获取玩家可以选择的任何随机选择的元素,并将选择的任何元素转换为 hash_tag,然后可以将其与所有元素的所有 hash_tags 进行比较-混合可能,寻找正
我有以下查询 SELECT TOP 1000 o.BuyerEMail, COUNT(*) HowMany, o.Name, o2.OrderID FROM Order
我目前正在使用 SQL Server 2008 R2,但在使用 STUFF 语句时遇到了困难。 以下语句工作正常: SET @col_names_2 = STUFF((
假设 stuff 包含大量 html,其中包括一个我想要填充到该元素后面的行中的元素: $("#content").html(stuff); 下面的行是否可以继续填充 stuff 中定义的元素,或者代
使用此处的教程: http://www.sqlservercurry.com/2008/06/combine-multiple-rows-into-one-row.html 我编写了以下查询: SEL
在一个非常庞大的代码库中,我发现了以下代码片段 System.getProperty("some stuff")。我尝试在一些 .properties 文件中查找该属性,但找不到它。你们有什么想法可以
我确实在 plupload 论坛上问过这个问题,但没有得到可用的回复。 我想做的是在 plupload 发挥它的魔力后重定向到确认页面,理想情况下我想捕获最近上传的文件名并将其打印在新页面上,以便用户
具体来说,我正在尝试将宏输出放入文档注释中。我很兴奋这正是我想要的: /// foo /// #[doc="bar\n\nbaz"] /// /// quux struct Dummy; 下一步是用我
我有一个填充了对象的 vector : std::vector stuffVector; 并且正在尝试使用清理函数删除它的所有元素 void CleanUp() { for (std::vec
#!/usr/bin/env python import this, that, other, stuff class SomeObject(object): pass def some_fu
有什么区别 while (expression): // do stuff endwhile; 和 while { } 最佳答案 没有功能上的区别。 在实际使用中我发现: while (express
我正在尝试获取特定应用的用户角色的逗号分隔列表。我以前用过 STUFF 和 FOR XML PATH('') 来解决这个问题,但我不知道在这种情况下我是否可以。这是显示我想做什么但不起作用的查询: S
我想为我的命名空间找到一个正确的名称,该名称将包含与横切关注点相关的所有项目,例如日志记录、安全性、本地化等。 我的想法是这样的: CompanyName.ApplicationServices.Lo
请参阅下面的 DDL: create table #Test (id int,Name varchar(30)) insert into #Test values (1,'Ian') insert i
我正在尝试制作一个简单的列表。 我有这个: String valuesArray[] = {"473", "592", "1774", "341", "355", "473", "950",
我是一名优秀的程序员,十分优秀!