我正在使用dwm窗口管理器运行Debian 10稳定的x64系统,并且正在使用Python 3.7.3。从some example code和draw_text
method itself可以看出,我应该能够使用以下代码在根窗口上绘制文本:
#!/usr/bin/env python3
import Xlib
import Xlib.display
display = Xlib.display.Display()
screen = display.screen()
root = screen.root
gc = root.create_gc(foreground = screen.white_pixel, background = screen.black_pixel)
root.draw_text(gc, 1, 1, b"Hello, world!")
此代码运行无错误,但未显示任何文本。我还尝试了不同的坐标,但没有任何运气。我的根窗口背景只是默认的黑色,所以我不认为文本不会显示出来,因为我将前景像素的颜色设置为白色。
答案 0 :(得分:3)
您是正确的,您的代码应在根窗口上绘制文本。您只需要:
xwininfo
很好)dwm
(默认情况下)显示顶部栏,则可能会隐藏文本。或者,如果您有其他窗口(例如,终端)位于顶部,则只需按[Alt] + b即可切换栏(ii)。此处有效的代码(Gentoo amd64 / desktop / stable,dwm-6.2,python-3.6.9):
#!/usr/bin/env python3
import Xlib
import Xlib.display
display = Xlib.display.Display()
screen = display.screen()
root = screen.root
gc = root.create_gc(foreground = screen.white_pixel, background = screen.black_pixel)
root.draw_text(gc, 100, 100, b"Hello, world!") # changed the coords more towards the center
display.flush() # To actually send the request to the server
请注意,如果其他窗口重叠或刷新该点,则文本将消失。文本将一直保留到,例如,您将窗口移到上方(擦除它),或切换到另一个dwm-Tab,其中的窗口覆盖了这些坐标。
如果要防止文本消失,则需要循环:
while True
循环,无论如何都将重绘它公开事件(请参阅https://tronche.com/gui/x/xlib/events/exposure/expose.html和http://python-xlib.sourceforge.net/doc/html/python-xlib_13.html#SEC12)
在必须重绘窗口区域时生成
但是,如果我们侦听根窗口的暴露事件,那么我们将一无所获(原因:(请参见dwm源代码中的setup
函数)没有root的ExposureMask)。我尝试过的工作:
#!/usr/bin/env python3
import Xlib
from Xlib import display, X # X is also needed
display = Xlib.display.Display()
screen = display.screen()
root = screen.root
#print(root.get_attributes())
root.change_attributes(event_mask=X.ExposureMask) # "adds" this event mask
#print(root.get_attributes()) # see the difference
gc = root.create_gc(foreground = screen.white_pixel, background = screen.black_pixel)
def draw_it():
root.draw_text(gc, 100, 100, b"Hello, world!")
display.flush()
draw_it()
while 1:
if display.pending_events() != 0: # check to safely apply next_event
event = display.next_event()
if event.type == X.Expose and event.count == 0:
draw_it()