【问题标题】:Python Tkinter Crashing, every run but program continues? Final polishing of TkinterPython Tkinter 崩溃,每次运行但程序继续? Tkinter 的最终抛光
【发布时间】:2013-07-24 15:12:58
【问题描述】:

我是 Tkinter 的新手和新手,对我来说很轻松。我试图正确编码,但我一定做错了什么。这些都是我面临的问题。

问题:

  • 只要我移动滑块,Python 就会崩溃,尽管程序继续运行??随机
  • 虽然缩放按钮与滑块的代码相同,但它不更新图形?
  • 人偶周围有一块大黑板,看起来很垃圾
  • 代码的一般速度很差。

崩溃(继续运行)是:

  • 运行时错误!程序:C:\Python27\pythonw.exe [MS Visual C++ 运行时库]
  • 异常未知软件异常 (0x40000015) 发生在应用程序的位置 0x1e06016a [TclNotifier: pythonw.exe]

这些是我真正想知道的,只是为了完善程序,使其反应灵敏且友好。

感谢您的帮助

# ---------- Imports ------------------------------------- #
from Tkinter import *
import matplotlib
import numpy as np
# ---------- Settings ------------------------------------ #
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
# ---------- Classes  ------------------------------------ #
class App(Frame):
    def __init__(self,master=None):
        Frame.__init__(self, master)
        self._job = None
        self.canvas = None
        self.Flag_Zoom = False
        self.pack()
        self._GUI_Design()
        self._GenData()
        self._Figure(self.Arm,self.Flag_Zoom)
        # Load the figure Window
        # Send to TK           
        self.canvas = FigureCanvasTkAgg(self.f, master=self.LF_Graph)

    def _GUI_Design(self):
        # Initial Frames        
        self.LF_Control = LabelFrame(self, text='Angle Controls', width=400, height=100, )
        self.LF_Graph = LabelFrame(self, text='Figure', width=400, height=400)
        self.LF_Control.grid(row=0, column=1, padx=5,pady=1)
        self.LF_Graph.grid(row=1, column=0,columnspan=2,padx=5,pady=3)

        # Insert Controls
        # Labels
        self.LB_Info = Label(self,text="Reduced Code", justify=LEFT)
        self.LB_SP = Label(self.LF_Control, text="Spoiler:")        

        #   Slider
        self.SpScale = Scale(self.LF_Control, from_=0, to=120, orient=HORIZONTAL, length=300, resolution=1, command=self._UpdateCanvas, tickinterval=10)      

        #   Buttons
        self.Zoomb = Button(self.LF_Control, text="Zoom", command=self._Zoom)
        self.Quit = Button(self.LF_Control, text="Quit", command=self.quit)

        # Grid Layout
        self.LB_Info.grid(row=0, column=0,padx=5,pady=1)
        self.LB_SP.grid(row=0, column=0,padx=10,pady=1)
        self.SpScale.grid(row=0, column=1,padx=10,pady=1)
        self.Zoomb.grid(row=0, column=3 ,padx=10,pady=1)
        self.Quit.grid(row=1, column=3 ,padx=10,pady=1)

    def _GenData(self):
        self.Arm     = [[0,10,184.533],[0,153.734,164.932]]                 

    def _UpdateCanvas(self, event):
        self._job = self.after(100, self._Execute(self.Flag_Zoom))  #miliseconds
        if self._job:
            self.after_cancel(self._job)

    def _Figure(self,Arm,Zoom):
        # Gen Figure
        self.f = plt.figure(1,figsize=(10,10))
        self.f.frame = False
        plt.clf()
        if Zoom == False:
            plt.axis([-500,2000,-1500,1000])
        else:
            plt.axis([-100,500,-100,500])                
        plt.axes().set_aspect('equal', 'datalim')
        plt.plot(Arm[0],Arm[1],"g")

    def _Zoom(self):
        self._UpdateCanvas
        if self.Flag_Zoom == True:
            self.Flag_Zoom = False
        else:
            self.Flag_Zoom = True

    def _Execute(self,Zoom):
        RotA = self.RotateNO(self.Arm,self.SpScale.get(),[0,0])
        self._Figure(RotA,Zoom)
        self.canvas.draw()
        self.canvas.show()
        if self.canvas:
            self.canvas.get_tk_widget().grid(row=0, column=0)
# ----------  Calculations -------------------------------- #
def RotateNO(self,List,Angle,Orig):       
    # Angle: deg2rad
    th = -1.*float(Angle)/180*np.pi
    Rot = [[],[]]
    # Loop through
    for i in xrange(0,len(List[0])):
        X1 = (List[0][i]-Orig[0])*np.cos(th) - (List[1][i]-Orig[1])*np.sin(th)+Orig[0]
        Y1 = (List[0][i]-Orig[0])*np.sin(th) + (List[1][i]-Orig[1])*np.cos(th)+Orig[1]
        Rot[0].append(X1)
        Rot[1].append(Y1)
    return Rot       
# ---------- Execute Application ------------------------- #
root = Tk()
root.title("Rotation")
Exe = App(master=root)
Exe.mainloop()
root.destroy()

【问题讨论】:

    标签: python tkinter figure


    【解决方案1】:

    您需要 RotateNO 才能成为课堂的一部分。此外,缩放不需要采用zoom 参数,因为您已经初始化了self.Flag_Zoom。还将root.destroy() 更改为Exe.destroy()。试试这个:

    # ---------- Imports ------------------------------------- #
    from Tkinter import *
    import matplotlib
    import numpy as np
    # ---------- Settings ------------------------------------ #
    matplotlib.use('TkAgg')
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    # ---------- Classes  ------------------------------------ #
    class App(Frame):
        def __init__(self,master=None):
            Frame.__init__(self, master)
            self._job = None
            self.canvas = None
            self.Flag_Zoom = False
            self.pack()
            self._GUI_Design()
            self._GenData()
            self._Figure(self.Arm)
            # Load the figure Window
            # Send to TK           
            self.canvas = FigureCanvasTkAgg(self.f, master=self.LF_Graph)
    
        def _GUI_Design(self):
            # Initial Frames        
            self.LF_Control = LabelFrame(self, text='Angle Controls', width=400, height=100, )
            self.LF_Graph = LabelFrame(self, text='Figure', width=400, height=400)
            self.LF_Control.grid(row=0, column=1, padx=5,pady=1)
            self.LF_Graph.grid(row=1, column=0,columnspan=2,padx=5,pady=3)
    
            # Insert Controls
            # Labels
            self.LB_Info = Label(self,text="Reduced Code", justify=LEFT)
            self.LB_SP = Label(self.LF_Control, text="Spoiler:")        
    
            #   Slider
            self.SpScale = Scale(self.LF_Control, from_=0, to=120, orient=HORIZONTAL, length=300, resolution=1, command=self._UpdateCanvas, tickinterval=10)      
    
            #   Buttons
            self.Zoomb = Button(self.LF_Control, text="Zoom", command=self._Zoom)
            self.Quit = Button(self.LF_Control, text="Quit", command=self.quit)
    
            # Grid Layout
            self.LB_Info.grid(row=0, column=0,padx=5,pady=1)
            self.LB_SP.grid(row=0, column=0,padx=10,pady=1)
            self.SpScale.grid(row=0, column=1,padx=10,pady=1)
            self.Zoomb.grid(row=0, column=3 ,padx=10,pady=1)
            self.Quit.grid(row=1, column=3 ,padx=10,pady=1)
    
        def _GenData(self):
            self.Arm     = [[0,10,184.533],[0,153.734,164.932]]                 
    
        def _UpdateCanvas(self, event):
            self._job = self.after(100, self._Execute(self.Flag_Zoom))  #miliseconds
            if self._job:
                self.after_cancel(self._job)
    
        def _Figure(self,Arm):
            # Gen Figure
            self.f = plt.figure(1,figsize=(10,10))
            self.f.frame = False
            plt.clf()
            if not self.Flag_Zoom:
                print 'no zoom'
                plt.axis([-500,2000,-1500,1000])
            else:
                print 'zoom'
                plt.axis([-100,500,-100,500])                
            plt.axes().set_aspect('equal', 'datalim')
            plt.plot(Arm[0],Arm[1],"g")
    
        def _Zoom(self):
            if self.Flag_Zoom:
                self.Flag_Zoom = False
            else:
                self.Flag_Zoom = True
            self._UpdateCanvas
            RotA = self.RotateNO(self.Arm,self.SpScale.get(),[0,0])
            self._Figure(RotA)
            self.canvas.draw()
            self.canvas.show()
    
        def RotateNO(self,List,Angle,Orig):       
            # Angle: deg2rad
            th = -1.*float(Angle)/180*np.pi
            Rot = [[],[]]
            # Loop through
            for i in xrange(0,len(List[0])):
                X1 = (List[0][i]-Orig[0])*np.cos(th) - (List[1][i]-Orig[1])*np.sin(th)+Orig[0]
                Y1 = (List[0][i]-Orig[0])*np.sin(th) + (List[1][i]-Orig[1])*np.cos(th)+Orig[1]
                Rot[0].append(X1)
                Rot[1].append(Y1)
            return Rot
    
        def _Execute(self,Zoom):
            RotA = self.RotateNO(self.Arm,self.SpScale.get(),[0,0])
            self._Figure(RotA)
            self.canvas.draw()
            self.canvas.show()
            if self.canvas:
                self.canvas.get_tk_widget().grid(row=0, column=0)
    
    # ---------- Execute Application ------------------------- #
    root = Tk()
    root.title("Rotation")
    Exe = App(master=root)
    Exe.mainloop()
    Exe.destroy()
    

    要最小化绘图周围的灰色边框,请添加

    plt.xticks([])
    plt.yticks([])
    plt.tight_layout(pad=0.0, w_pad=0.0, h_pad=0)
    

    到您的 _Figure(self,Arm) 方法的末尾。这给了我:

    (我更改了 figsize 以便整个东西都适合我的屏幕)

    【讨论】:

    • 感谢 Seth,Exe.destroy 完美地阻止了错误。我现在明白了,是因为我正在扼杀建立课程的基础吗?非常感谢。关于图形黑色边框的任何想法?抱歉,RotateNO(New origin) 的缩进错误是一个错字。我有另一个问题?为什么我在执行_Zoom时需要重复绘制图形,因为它假设调用_UpdateCanvas最终调用_Figure绘图函数?
    • 大多数情况下,我会附加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2022-11-27
    • 2021-03-24
    相关资源
    最近更新 更多