Python:Tkinter文本小部件,新窗口按钮

时间:2014-04-24 13:08:08

标签: python tkinter python-multithreading

我正在创建一个基于tkinter的文本小部件,我正在尝试在其中实现一个新的窗口函数。但每次我点击新窗口按钮时,我都会在IDLE中收到此错误:RuntimeError:从不同的公寓调用Tcl

这是我的代码:

#!/usr/bin/env python
from Tkinter import *
from tkSimpleDialog import askstring
from tkFileDialog   import asksaveasfilename
from tkFileDialog import askopenfilename
from tkMessageBox import askokcancel
import Tkinter as tk
import ttk 
import threading
from ScrolledText import ScrolledText
Window = Tk() 
Window.title("TekstEDIT")

/..CODE.../

class newWindowThread(threading.Thread):
    def __init__(self, choosen=""):
        threading.Thread.__init__(self)
        self.choosen = choosen
    def run(self):
        if self.choosen == "":
            root = Tk()
            newEditor = SimpleEditor(root)
            root.mainloop()
        else:
            root = Tk()
            newEditor = SimpleEditor(root, self.choosen)
            root.mainloop()
/...CODE.../
wFile = Menu(menubar, tearoff=0,relief="raised")
    wFile.add_command(label="New", accelerator="Ctrl+N", command=self.onNew)
    wFile.add_command(label="New Window", accelerator="Ctrl+Shift+N", command=self.onNewWindow)
/...CODE.../
def onNewWindow(self):
    t=newWindowThread()
    t.start()

问题的根源是什么?我该如何解决?

源代码:http://ideone.com/npWuYD

感谢。

1 个答案:

答案 0 :(得分:1)

您不能以这种方式混合Tkinter和线程。 Tkinter不是线程安全的。此外,tkinter的设计使您只能运行Tk的单个实例。

如果您想要多个窗口,则不需要线程,并且您不需要Tk的多个实例。像往常一样创建根窗口,对于其他窗口创建Toplevel的实例。