打开窗口时Tkinter运行时错误最大递归

时间:2015-05-21 10:25:18

标签: python tkinter runtime tkinter-canvas

我实际上有一个大问题。 我已经有了一个tkinter窗口,我想打开另一个窗口。

import Tkinter
from Tkinter import *
import threading, time
from PIL import Image, ImageTk
from record_pd import *

class Gui_Record(Tkinter.Tk):

    def __init__(self, tkroot):
        self.root = Tk()
        self.root.title("Enregistreur")
        #self.root.geometry()                                                                                                                                                                                                                
        self.root.geometry("%dx%d+%d+%d" % (500, 70, 400, 300))
        self.root.c = Canvas(tkroot, bg='black')
        self.root.c.pack(fill=BOTH, expand=YES)
        self.initialize()
        self.recorder = RecordPd(tkroot)
        self.recorder.init_recorder()

    def initialize(self):
        #self.root.grid()                                                                                                                                                                                                                    

        self.root.resizable(False, False)

        self.Imgtmp = PhotoImage(file="img/record.png")
        self.imgclear = PhotoImage(file="img/clear.png")

        self.root.title = Tkinter.Label(self.root, text="Enregistreur Orgue Sensoriel", bg="black", fg="white", font=("Helvetica", 16))

        self.root.title.pack()

        self.root.button = Tkinter.Button(self, command=self.OnButtonClick, bg="black", bd=0)

        self.root.button.config(highlightthickness=0)
        self.root.button.config(activebackground="black")

        self.root.button.config(image=self.Imgtmp)
        self.root.button.pack()

        self.root.bind("<Destroy>", self._onDestroy)
        self.resume = True
        self.activate = False


    def setTkroot(self, tkroot):
        self.tkroot = tkroot

    def _onDestroy(self, e):
        self.resume = False
        self.recorder.stop_recording()


    def OnButtonClick(self):
       if (self.activate == False):
            self.resume = True
            self.recorder.open_wav()
            self.recorder.start_recording()
            thread = threading.Thread(target=self.threadClignoter)
            thread.start()
            self.activate = True
            print("In recording..")
       else:
            self.stopThread()
            self.recorder.stop_recording()
            self.activate = False

    def threadClignoter(self):
      isVisible = True

      while self.resume:
            if isVisible:
                clr = self.imgclear
            else:
                clr = self.Imgtmp

            self.root.button.config(image=clr)
            isVisible = not isVisible
            time.sleep(0.5)

    def stopThread(self):
        print("Record done.")
        self.resume = False
        self.root.button.config(image=self.Imgtmp)

当我打电话给我的对象时,我做了:

rec = Gui_Record(self.tkroot)
rec.mainloop()

当我启动一个窗口时,没关系。但当我将我的新窗口添加到我的父窗口时,它发生了:

traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
    return self.func(*args)
  File "/home/naqued/Documents/assembla/backup/naqued-s-space/stido/gui_stido.py", line 139, in launch_recorder
    app = Gui_Record(self.tkroot)
  File "/home/naqued/Documents/assembla/backup/naqued-s-space/stido/record_gui.py", line 18, in __init__
    self.initialize()
  File "/home/naqued/Documents/assembla/backup/naqued-s-space/stido/record_gui.py", line 35, in initialize
    self.root.button = Tkinter.Button(self, command=self.OnButtonClick, bg="black", bd=0)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2128, in __init__
    Widget.__init__(self, master, 'button', cnf, kw)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2049, in __init__
    BaseWidget._setup(self, master, cnf)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2022, in _setup
    if not master:
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1848, in __getattr__
    return getattr(self.tk, attr
.... ... ... ... .. .. ... 
  return getattr(self.tk, attr)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1848, in __getattr__
    return getattr(self.tk, attr)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1848, in __getattr__
    return getattr(self.tk, attr)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1848, in __getattr__
    return getattr(self.tk, attr)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1848, in __getattr__
    return getattr(self.tk, attr)
RuntimeError: maximum recursion depth exceeded while calling a Python object

我不对我的代码进行递归。 我不知道发生了什么,也没有在网上找到任何东西。

1 个答案:

答案 0 :(得分:2)

您正在创建一个继承自Tk的类,但会创建一个Tk的新实例,即使您没有显示它,也就是在某个时刻创建了另一个根(该对象被传递为tkroot)我不确定这是否只是 问题,但它肯定是一个问题。

由于这是辅助窗口,因此不应继承Tkinter.Tk。相反,继承自Tkinter.Toplevel

您还遇到一个问题,即使这会创建一个新窗口作为tkroot的子窗口,但某些内部窗口小部件正在创建为tkroot的子窗口,因此它们不会出现在此窗口中窗口。

您还需要修复导入 - 您不应该从Tk进行全局导入导入Tk作为模块。

你可能会遇到其他问题。 Tkinter与线程不兼容。我听说它有时适用于linux,但一般情况下,除了创建小部件之外的任何线程都不应该调用任何GUI函数。