yang4384 发表于 2023-1-9 09:47

【python】ttkbootstrap的窗口关闭事件问题

想给窗口关闭的时候弹出确认取消的消息框,在外边能运行但是放窗口关闭函数里就不行了有大佬帮忙看看吗

报了这个 RuntimeError: Calling Tcl from different apartment

import ttkbootstrap as ttk
from ttkbootstrap.dialogs import Messagebox
import threading

class TestGui:
    def __init__(self, root_window):
      self.root_windows = root_window
      self.root_windows.title("11111111")
      self.root_windows.geometry("380x285")
      self.root_windows.protocol('WM_DELETE_WINDOW', lambda: self.thread_it(self.clos_window))
      # Messagebox.okcancel(message="确定取消") 正常弹窗



    def clos_window(self):
      Messagebox.okcancel(message="确定取消")#这就报错了用self方法也是
      # 还没加入判断 只是测试消息框




    def thread_it(self, func, *args):
      self.myThread = threading.Thread(target=func, args=args)
      self.myThread .setDaemon(True)
      self.myThread .start()

if __name__ == '__main__':
    root_window = ttk.Window()
    root_window.attributes("-topmost", 1)
    root_window.resizable(width=False, height=False)
    test_gui = TestGui(root_window)
    root_window.mainloop()

QingTianGG 发表于 2023-1-9 11:02

self.root_windows.protocol("WM_DELETE_WINDOW", lambda arg=self.root_windows: self.clos_window(arg))

    def clos_window(self, master):
      Messagebox.okcancel(message="确定取消")

yang4384 发表于 2023-1-9 11:09

QingTianGG 发表于 2023-1-9 11:02
self.root_windows.protocol("WM_DELETE_WINDOW", lambda arg=self.root_windows ...

可以了 可以了 谢谢大佬 可以告诉我咋回事吗   这代码是我在没用ttkbootstrap之前的程序里拿出来的,用了ttkbootstrap之后不知道啥情况开发文档也没看明白

QingTianGG 发表于 2023-1-9 11:13

yang4384 发表于 2023-1-9 11:09
可以了 可以了 谢谢大佬 可以告诉我咋回事吗   这代码是我在没用ttkbootstrap之前的程序里拿出来的,用了 ...

https://www.pythonheidong.com/blog/article/657599/d3d5319f0fedc05bcce4/

我是参考了这个的代码{:301_1008:},我也没弄明白

yang4384 发表于 2023-1-9 13:09

QingTianGG 发表于 2023-1-9 11:13
https://www.pythonheidong.com/blog/article/657599/d3d5319f0fedc05bcce4/

我是参考了这个的代码{:3 ...

能用是能用了 但是现在我的多线程没用了:'(weeqw

xilidexiao 发表于 2023-1-9 14:08

import ttkbootstrap as ttk
from ttkbootstrap.dialogs import Messagebox


class TestGui:
    def __init__(self, root_window):
      self.root_windows = root_window
      self.root_windows.title("11111111")
      self.root_windows.geometry("380x285")
      self.root_windows.protocol("WM_DELETE_WINDOW", self.close_windows)

    def close_windows(self):
      result = Messagebox.okcancel("确认退出吗?", "提示")
      print(result)
      if result == "确定":
            self.root_windows.destroy()


if __name__ == '__main__':
    root_window = ttk.Window()
    root_window.attributes("-topmost", 1)
    root_window.resizable(width=False, height=False)
    test_gui = TestGui(root_window)
    root_window.mainloop()

yang4384 发表于 2023-1-9 14:47

xilidexiao 发表于 2023-1-9 14:08
import ttkbootstrap as ttk
from ttkbootstrap.dialogs import Messagebox



可是这样我的多线程就没了哎 我测试过其实是可以正常调用函数的但运行到 Messagebox就不行了

yang4384 发表于 2023-1-9 14:49

测试了一下 其实能调用def函数,但是一运行messgbox就不行了不知道是不是我在def里的写法有问题

xilidexiao 发表于 2023-1-9 15:11

yang4384 发表于 2023-1-9 14:47
可是这样我的多线程就没了哎 我测试过其实是可以正常调用函数的但运行到 Messagebox就不行了

tkinter界面单线程占用的 用不了多线程

yang4384 发表于 2023-1-9 15:19

xilidexiao 发表于 2023-1-9 15:11
tkinter界面单线程占用的 用不了多线程

那为啥我没装ttkbootstrap之前 用默认的tk可以我复制原来的代码过来的只是觉得界面太丑换一下第三方主题
页: [1] 2
查看完整版本: 【python】ttkbootstrap的窗口关闭事件问题