【发布时间】:2013-09-25 09:18:01
【问题描述】:
我在触摸屏计算机上使用 pygtk 作为 gui 作为机器用户界面。用户可以随时保存机器的实际配置。当他按下“保存配置”按钮时,我实现的虚拟键盘出现在屏幕上,使他能够介绍配置名称。我的问题是这个键盘在按下按钮“保存配置”后没有直接出现。应该等待下一次单击屏幕上的任意位置以使其显示。
这里是班级keyboard:
class keyboard():
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(1)
window.set_keep_above(True)
window.connect("destroy", lambda w: window.destroy())
window.set_transient_for(self.gui.window) #self.gui.window is the main window
window.set_destroy_with_parent(True)
window.set_skip_taskbar_hint(True)
window.set_skip_pager_hint(True)
window.connect("delete_event",window.hide_on_delete)
window.deiconify()
window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN)
window.set_size_request(KBD_WIN_WIDTH,KBD_WIN_HEIGHT)
window.set_resizable(False)
table = gtk.Table(rows=5, columns=12, homogeneous=True)
frame = gtk.Frame()
frame.add(table)
window.add(frame)
"""
... code to fill the table with buttons
"""
self.window = window
这是点击“保存配置”按钮后调用的回调函数:
def save_cfg_clicked(self,widget):
keyboard_ = keyboard(self)
keyboard_.window.set_keep_above(True)
keyboard_.window.set_modal(True)
keyboard_.window.show_all()
我已经尝试了几种方法,例如使用 gobject.idle_add 调用函数 window.show_all,但这没有帮助。
请注意,我使用的是 xfce 桌面。程序在 Gnome 上运行时不会出现此问题。
【问题讨论】:
-
听起来像是窗口管理器的问题。一些窗口管理器希望您单击屏幕以决定放置窗口的位置。我不知道 Xfce 会这样做,但 TWM 肯定会这样做。也许连接鼠标会比使用触摸屏更清楚地说明这一点?
-
当我用鼠标点击按钮时问题仍然存在
-
我的意思是,当第一次创建窗口时,窗口管理器通常会创建一个轮廓(随鼠标光标移动)。单击后,窗口将放置在轮廓所在的位置并出现。我建议鼠标的唯一原因是如果轮廓存在则使其更加明显(以确认我的理论是否正确)。
-
因为
window.set_position(1)这行,窗口总是出现在中间,与最后一次点击的光标位置无关。但是,我找到了一个迂回的方法,请参阅我的答案。