簡體   English   中英

不在課堂上的任何地方使用網格仍然會出現錯誤“不能在里面使用幾何管理器包”。 在 tkinter 中已經有由網格管理的奴隸

[英]Not using grid anywhere in class still gives error 'cannot use geometry manager pack inside . which already has slaves managed by grid' in tkinter

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()線上它給出了錯誤'不能在內部使用幾何管理器包。 已經有由網格管理的奴隸'

調用函數的代碼:

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

調用類的代碼:

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)

如果您使用這種結構,那么很容易掌握您擁有的不同視圖。 此外,它還允許您同時運行不同的根窗口:

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()

這顯示了一個使用三個類的簡單應用程序,一個是根,另一個是示例頁面。 要翻轉到具有相同根類的不同 Frame,您所要做的就是調用controller.show_frame(FRAMENAME) ,這將切換頂部的幀。 要擁有多個不同的根,您只需創建一個新的根類,並以相同的方式構建和填充它。

我只是想發表評論,因為我遇到了這個錯誤並試圖找出原因,就我而言,這是由於在我的窗口/頁面類中使用了super.init() ..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM