[英]Not using grid anywhere still gives error 'cannot use geometry manager pack inside .frame2 which already has slaves managed by grid' in 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.