在类的任何地方不使用网格仍然会出现错误“不能在内部使用几何图形管理器包”。在tkin已经有了由网格管理的奴隶

2024-06-28 19:48:14 发布

您现在位置:Python中文网/ 问答频道 /正文

class QuadEQPlot:

width=0;height=0;centerh=0;centerw=0;root=None

def __init__(self):
    root = Tk()
    root.title("Quadratic Equation Plot")
    width = 1200
    height = 800
    centerh = height/2
    centerw=width/2

def init_widgets(self,a,b,c):
    canvas_frame = Canvas(QuadEQPlot.root,width=QuadEQPlot.width, height=QuadEQPlot.height, bg='white')

    self.plot_axis(QuadEQPlot.root,QuadEQPlot.width,QuadEQPlot.height,QuadEQPlot.centerh,QuadEQPlot.centerw,canvas_frame)

    #start point
    x=-5.00
    xy = [] #array of points

    while (x<6):
        # x coordinates
        xy.append(x*9 + QuadEQPlot.centerw)
        # y coordinates
        xy.append(QuadEQPlot.centerh - (a*(x**2) +b*x +c)*9 )
        x+=0.01


    #plot all accumulated points
    quad_line = canvas_frame.create_line(QuadEQPlot.root,xy, fill='blue')
    canvas_frame.pack()
    root.mainloop()

def plot_axis(self,root,width,height,centerh,centerw,canvas_frame):
    # x and y axis plot
    center_line = canvas_frame.create_line(root,0, centerh, width, centerh, fill='black')
    center_line = canvas_frame.create_line(root,centerw, 0, centerw, height, fill='black')

    diffx=9
    markno=1
    # marking on x axis
    while(diffx<=centerw and markno<7):
        xrmarking=canvas_frame.create_line(root,centerw+diffx,centerh,centerw+diffx,centerh+5,fill='black')
        # marking text on rhs of x axis
        xrtext=canvas_frame.create_text(root,centerw+diffx,centerh+12,text="%d" %markno,fill='black')
        xlmarking=canvas_frame.create_line(root,centerw-diffx,centerh,centerw-diffx,centerh+5,fill='black')
        #marking  text on lhs of x axis
        xltext=canvas_frame.create_text(root,centerw-diffx,centerh+12,text="-%d" %markno,fill='black')
        markno+=1
        diffx+=9

    #zerotext=canvas_frame.create_text(centerw+5,centerh+9,text="0",fill="black")   

    diffy=0
    markno=0
    # marking on y axis
    while(diffy<=centerh):
        yrmarking=canvas_frame.create_line(root,centerw,centerh+diffy,centerw+5,centerh+diffy,fill='black')
        #yrtext=canvas_frame.create_text(centerw+12,centerh+diffy,text="%d" %markno,fill='black')
        ylmarking=canvas_frame.create_line(root,centerw,centerh-diffy,centerw+5,centerh-diffy,fill='black')
        #yltext=canvas_frame.create_text(centerw+12,centerh-diffy,text="%d" %markno,fill='black')
        #markno+=1
        diffy+=9

我从另一个使用网格的tkinter框架的类调用这个类。但是这个类不使用它,并且在canvas_frame.pack()行上给出错误“cannot use geometry manager pack inside”。已经有了由电网管理的奴隶

调用函数的代码:

^{pr2}$

调用类代码:

class CoefficientsDialog:

def __init__(self):
    master = Tk()
    master.minsize(width=200, height=100)
    #master.pack()
    Label(master, text="X^2     +").grid(row=2,column=5)
    Label(master, text="X         +").grid(row=4,column=5)

    e1 = Entry(master)
    e2 = Entry(master)
    e3 = Entry(master)

    a=0;b=0;c=0

    e1.grid(row=2, column=3)
    e2.grid(row=4, column=3)
    e3.grid(row=6, column=3)

    try:
        a=int(e1.get())
        b=int(e2.get())
        c=int(e3.get())

    except ValueError as e:
        a=0;b=1;c=0

    #Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4)
    Button(master, text='Submit', command=lambda : self.submit(a,b,c)).grid(row=8, column=3, sticky=W, pady=4)

    master.mainloop( )

def submit(self,a,b,c):
    obj=QuadEQPlot()
    obj.init_widgets(a,b,c)

Tags: textmastercreatelinerootwidthfillframe
1条回答
网友
1楼 · 发布于 2024-06-28 19:48:14

如果您使用这种结构,那么很容易保持对您所拥有的不同视图的了解。此外,它允许您同时运行不同的根窗口:

import tkinter as tk

class App(tk.Tk):
def __init__(self, *args, **kwargs):

    tk.Tk.__init__(self, *args, **kwargs)

    self.container = Frame(self)
    self.container.pack(side="top", expand=True)
    self.container.grid_rowconfigure(0, weight=1)
    self.container.grid_columnconfigure(0, weight=1)

    for F in (pageOne, pageTwo):
        self.frame = F(self.container, self)
        self.frames[F] = self.frame
        self.frame.grid(row=0, column=0, sticky="nsew", pady=5)
        self.show_frame(pageOne)

    def show_frame(self, frame):
        self.frame = self.frames[frame]
        self.frame.tkraise()

class pageOne(tk.Frame):
    def __init__(self, controller, parent):
        tk.Frame.__init__(self, parent)
        self.button1 = tk.Button(self, text="button")
        self.button1.pack()

class pageTwo(tk.Frame):
    def __init__(self, controller, parent):
        tk.Frame.__init__(self, parent)
        self.button1 = tk.Button(self, text="button")
        self.button1.pack()


app = App()

这显示了一个简单的应用程序,它使用三个类,一个是根,另一个是示例页。要切换到具有相同根类的不同帧,只需调用controller.show_frame(FRAMENAME),这将切换位于顶部的帧。要拥有多个不同的根,您只需创建一个新的根类,并以相同的方式构造和填充它。在

相关问题 更多 >