這是我原本repo裡的main.py
import subprocess
from Xlib.display import Display
from Xlib import X, XK
dpy = Display()
screen = dpy.screen()
root = screen.root
root.grab_key(dpy.keysym_to_keycode(XK.string_to_keysym("z")),X.Mod4Mask|X.Mod2Mask,1,X.GrabModeAsync,X.GrabModeAsync)
root.grab_key(dpy.keysym_to_keycode(XK.string_to_keysym("q")),X.Mod4Mask|X.Mod2Mask,X.ShiftMask,1,X.GrabModeAsync,X.GrabModeAsync)
def call_rofi():
if ev.type==X.KeyPress:
#print(f"press key:{ev.detail}")
if ev.detail==dpy.keysym_to_keycode(XK.string_to_keysym("z")):
subprocess.Popen(["rofi","-show","drun"])
def kill_window():
if ev.type==X.KeyPress:
if ev.detail==dpy.keysym_to_keycode(XK.string_to_keysym("q")):
window.kill_client()
while True:
ev=dpy.next_event()
call_rofi()
kill_window()
dpy.flush()
大多都ai生的
所以我想打掉重練 重開一個main.py
這是我忙一天的結果 最後也都ai教我
from Xlib import display,X,XK
dpy=display.Display()
screen=dpy.screen()
root=screen.root
#註冊事件
screen.root.grab_key(dpy.keysym_to_keycode(XK.string_to_keysym("q")),X.Mod4Mask,1,X.GrabModeAsync, X.GrabModeAsync)
#cursor=root.create_font_cursor(0) <--滑鼠顯示不出來
#cursor=dpy.create_resource_object("cursor")
#root.define_cursor(cursor)
while True:
event=dpy.next_event()
if event.type==X.KeyPress:
if event.detail==dpy.keysym_to_keycode(XK.string_to_keysym("q")):
X.kill_client(dpy)
dpy.flush()
其實看整體架構很像GUI的事件循環 像是QT,Tkinter
因為python-xlib的文檔不完整,內容很少
像是我看tinywm裡面有screen().root但python-xlib文檔裡面沒有寫,所以一路從pydoc追到dir()
zixgggg@watermelon:~/i4$ uv python -m pydoc python-xlib
error: unexpected argument '-m' found
Usage: uv python [OPTIONS] <COMMAND>
For more information, try '--help'.
zixgggg@watermelon:~/i4$ uv run python -m pydoc python-xlib
No Python documentation found for 'python-xlib'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.diszixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.screen
No Python documentation found for 'Xlib.display.screen'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.screen()
bash: 未預期的字組「(」附近有語法錯誤
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen()
bash: 未預期的字組「(」附近有語法錯誤
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen.root
No Python documentation found for 'Xlib.display.Display.screen.root'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen.root()
bash: 未預期的字組「(」附近有語法錯誤
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen
zixgggg@watermelon:~/i4$ uv run python
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> uv run python -m pydoc Xlib.display.Display.screen
File "<python-input-0>", line 1
uv run python -m pydoc Xlib.display.Display.screen
^^^
SyntaxError: invalid syntax
>>> from Xlib.display import Display
>>> dir(Display.screen)
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__']
>>> help(Display.screen)
>>> dpy = Display()
>>> scr = dpy.screen()
>>> dir(scr)
['__class__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', '_data']
>>> scr._data.keys()
dict_keys(['root', 'default_colormap', 'white_pixel', 'black_pixel', 'current_input_mask', 'width_in_pixels', 'height_in_pixels', 'width_in_mms', 'height_in_mms', 'min_installed_maps', 'max_installed_maps', 'root_visual', 'backing_store', 'save_unders', 'root_depth', 'allowed_depths'])
>>> scr.root_data.keys()
Traceback (most recent call last):
File "/home/zixgggg/i4/.venv/lib/python3.13/site-packages/Xlib/protocol/rq.py", line 1293, in __getattr__
return self._data[attr]
~~~~~~~~~~^^^^^^
KeyError: 'root_data'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<python-input-8>", line 1, in <module>
scr.root_data.keys()
^^^^^^^^^^^^^
File "/home/zixgggg/i4/.venv/lib/python3.13/site-packages/Xlib/protocol/rq.py", line 1297, in __getattr__
raise AttributeError(attr)
AttributeError: root_data
>>>
我就查到dir(scr)而已,我對python底層不熟,scr._data.keys()是ai跟我講的help(Display.screen)裡面只有:
Help on function screen in module Xlib.display:
screen(self, sno=None)
而uv run python -m pydoc Xlib.display.Display.screen裡面:
Help on function screen in Xlib.display.Display:
Xlib.display.Display.screen = screen(self, sno=None)
看完上面的記錄就說明了Xlib為何複雜,不僅是X11本身協議極其繁瑣,python的綁定文檔不周全,真要查就只能去看複雜難懂的Xlib C API 我就是不想寫C才用python阿 都用py幹嘛還看C文檔
文檔不全這個問題我特別去註冊stackoverflow問(對我以前都沒有在用SO),目前問題還在審核,出來了我再更新文章
我目前的感想是xlib仿佛就像是一個黑盒子 網路上沒什麼教學 那些大佬又不知道在沒有ai和文檔的情況下知道那些函式 好像他們會通靈一樣