有沒有辦法改變showinfo(和其他對話框)的WM_CLASS?className、class_ 引數為 Tk、Toplevel 完成作業。
import tkinter as tk
from tkinter.messagebox import showinfo
if __name__ == '__main__':
root = tk.Tk(className='ymail')
mail_client = tk.Toplevel(root, class_='ymail')
new_message = tk.Toplevel(root, class_='ymail')
showinfo(title="Cancel sending", parent=new_message, message="""
Send is cancelled due to empty message""")
root.mainloop()
對于 showinfo 對話框
$ xprop WM_CLASS
給
WM_CLASS(STRING) = "__tk__messagebox", "Dialog"
我認為用 Alt-~ (Tilde) 回圈 tkinter 視窗很方便,它們的 WM_CLASS 應該是相同的。
我進行了搜索(“tkinter change WM_CLASS showinfo”)。有些命中不適用,有些不起作用(xdotool),有些我寧愿用作最后的手段(將C程式轉換為python)。
Using
Debian 10
python 3.7.3
GNOME 3.30.1
編輯
添加的解決方法(使用 xdotool)
import threading
import subprocess
import time
import tkinter as tk
from tkinter.messagebox import showinfo
def change_dialog_class(from_="Dialog", to_="ymail"):
cmd = f"xdotool search --class {from_} set_window --class {to_}"
time.sleep(1)
subprocess.run(cmd.split())
if __name__ == '__main__':
root = tk.Tk(className='ymail')
mail_client = tk.Toplevel(root, class_='ymail')
new_message = tk.Toplevel(root, class_='ymail')
tk.Frame.class_ = 'ymail'
threading.Thread(target=change_dialog_class, args=("Dialog", "ymail"),
daemon=True).start()
showinfo(title="Cancel sending", parent=new_message,
message="""Send is cancelled due to empty message""")
root.mainloop()
與 ymail.desktop 一起作業
$ cat ~/.local/share/applications/ymail.desktop
[Desktop Entry]
Type=Application
Terminal=false
Name=ymail
Icon=python
StartupWMClass=ymail
然而,python 解決方案會更好
uj5u.com熱心網友回復:
由于我不是XSystem 用戶,所以我花了一些時間來跟進。看起來您正在尋找 wm_group, 不幸的是,如果沒有子類化它是不可能的,這與使用 tk.Toplevel 撰寫自己的類幾乎相同。無論如何,我希望 toplevel.wm_group(root) 能輕松解決問題并為您作業。
在我注意到SimpleDialog可能有一些你想保留的功能并且可能很難為自己編碼之后,我決定寫一個你可能想要使用的答案。它還提供了class_選項以防萬一wm_group為您作業。
這是代碼:
import tkinter as tk
import tkinter.simpledialog as simpledialog
class MessageBox(simpledialog.SimpleDialog):
def __init__(self, master,**kwargs):
simpledialog.SimpleDialog.__init__(self,master,**kwargs)
#root.tk.call('wm', 'group', self.root._w, master)
def done(self,num):
print(num)
self.root.destroy()
root = tk.Tk()
MessageBox(root,title='Cancel',text='Im telling you!',class_='ymail',
buttons=['Got it!','Nah'], default=None, cancel=None)
root.mainloop()
這是來源: https ://github.com/python/cpython/blob/main/Lib/tkinter/simpledialog.py#L31
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/477345.html
標籤:python-3.x tkinter 侏儒 3
