gpt4 book ai didi

尝试更新按钮标签文本时 Python GUI 卡住或关闭

转载 作者:行者123 更新时间:2023-12-01 04:00:26 25 4
gpt4 key购买 nike

我正在尝试从 ubuntu 终端读取字符串并将该字符串设置为按钮的标签。它在某些迭代中完美工作,然后卡住或因错误而关闭。我找不到任何关于它何时卡住或关闭的模式。我正在使用 gtk 库和 python 2.7。

下面是 UI 卡住后的屏幕截图。

Screenshot of the frozen UI(with error)

如上图所示,它已经成功更新了值234、56,然后在收到213字符串后错误退出。您还可以观察到 UI 中的按钮也有 213 值。

有时,用户界面只是卡住而不显示任何错误或退出。

我使用了以下代码

1. thread.py (从终端调用的主程序)

import thread
import time
import gui2
import vkeys1
import os
try:
thread.start_new_thread( vkeys1.main, ( ) )
thread.start_new_thread( gui2.main, ( ) )
except:
print "Error: unable to start thread"

# To stop this script from closing
os.system("mkfifo d1 2> error.log")
fd = os.open('d1', os.O_RDONLY)
ch = os.read(fd,1) # No writer

2. vkeys1.py (从终端读取输入并调用textinit())

import gui2
def main() :
while True:
try :
gui2.ch = str(input('\nInput a string : '))
gui2.textinit()
except :
print(" \n\n Exception!! \n\n")

3. gui2.py (更新按钮标签)

from gi.repository import Gtk, GdkPixbuf, Gdk, GLib
import Image
import os, sys
import time
import vkeys1
import threading

global ch # ch is used at vkeys1.py to store the input
ch = 'dummy content'

button0 = Gtk.Button(label="Initially empty")

class TableWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="String retrieval widget")
self.set_size_request(500,200)
self.connect_after('destroy', self.destroy)
self.main_box=Gtk.VBox()
self.main_box.set_spacing(5)

self.label = Gtk.Label(" ")

table = Gtk.Table(7,4, True)
self.add(self.main_box)
self.main_box.pack_start(self.label, False, False, 0)
self.main_box.pack_start(table, False, False, 0)

table.attach(button0, 0, 4, 0, 1)
self.show_all()

def destroy(window, self):
Gtk.main_quit()


def textinit(): # called from vkeys1.py
class Thrd(threading.Thread) :
def __init__(self) :
threading.Thread.__init__(self)
print('\nReceived string')
print(str(ch))
print('\n')
button0.set_label(str(ch)) # Button label updated here
Thrd2 = Thrd()
Thrd2.start()
return

def main():
app=TableWindow()
app.set_keep_above(True)
app.set_gravity(Gdk.Gravity.SOUTH_WEST)
Gtk.main()

if __name__ == "__main__":# for any error exit
sys.exit(main())

上面的代码可以通过输入python thread.py来运行(在创建上述3个文件之后)。请提出任何解决方案来克服这个卡住问题。

最佳答案

崩溃的最可能原因是您的代码从运行主循环的线程以外的线程调用 GTK 代码,documentation states是不允许的。

要解决此问题,请将 gui2.textinit() 的调用替换为 GLib.idle_add(gui2.textinit)(请注意 后面缺少括号) textinit)。

关于代码的几点说明:

  • 通用异常处理程序会屏蔽发生的异常。删除它,当出现问题时您将看到有用的回溯。

  • 如果您在 Python 2 下运行,您可能需要将 input 更改为 raw_input,否则代码会因任何非有效 Python 的输入而阻塞表达。

  • textinit 创建一个从不运行实际线程的线程对象。当继承threading.Thread时,必须重写run函数,一旦调用start(),该函数就会在新线程中调用。在构造函数中完成这些工作不会完成任何任务。

  • thread.start_new_thread 是一个低级 API,在正常情况下不应使用,在 Python 3 中已降级为 _thread。而不是 thread.start_new_thread(fn, ()),使用threading.Thread(target=fn),意义相同,同样返回一个Thread 对象。

关于尝试更新按钮标签文本时 Python GUI 卡住或关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36655991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com