将python tkinter窗口添加为类,但无法显示任何类
我一直在使用tkinter为粒子探测器创建图像分析仪。完成主窗体后,我决定需要几个其他的“窗口”或与我习惯的VB“窗体”关联。我发现这样做的方法是为每个“表单”使用类,但是在这样做之后,我无法让它们中的任何一个显示出来,只有一个空的Tk窗口。以下是我的代码,如有任何帮助,将不胜感激:将python tkinter窗口添加为类,但无法显示任何类,python,forms,tkinter,Python,Forms,Tkinter,我一直在使用tkinter为粒子探测器创建图像分析仪。完成主窗体后,我决定需要几个其他的“窗口”或与我习惯的VB“窗体”关联。我发现这样做的方法是为每个“表单”使用类,但是在这样做之后,我无法让它们中的任何一个显示出来,只有一个空的Tk窗口。以下是我的代码,如有任何帮助,将不胜感激: class Application(Tk.Tk): def __init__(self, *args, **kwargs): Tk.Tk.__init__(self, *args, **
class Application(Tk.Tk):
def __init__(self, *args, **kwargs):
Tk.Tk.__init__(self, *args, **kwargs)
container = Tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.frames = {}
for F in (createHome, createViewer, createAnalyse):
frame = F(container, self)
self.frames[F] = frame
self.show_frame(createHome)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class createHome(Tk.Frame):
def __init__(self, parent, controller):
Tk.Frame.__init__(self,parent)
Frame = Tk.Frame(self)
Frame.pack(side="top", fill="both",expand=True)
NewSet = Tk.Button(Frame, text="New Set",command=lambda: controller.show_frame(createViewer))
NewSet.pack(side="top", padx = 5, pady = 10)
LoadSet = Tk.Button(Frame, text="Load Set",command=lambda: controller.show_frame(createViewer))
LoadSet.pack(side="top", padx = 5, pady = 10)
Analyse = Tk.Button(Frame, text="Analyse",command=lambda: controller.show_frame(createAnalyse))
Analyse.pack(side="top", padx = 5, pady = 10)
class createViewer(Tk.Frame):
def __init__(self, parent, controller):
Tk.Frame.__init__(self,parent)
leftFrame = Tk.Frame(self)
leftFrame.pack(side="left")
botLeftFrame = Tk.Frame(leftFrame)
botLeftFrame.pack(side="bottom")
Import = Tk.Button(botLeftFrame)
Import["text"] = "Import"
Import["command"] = self.importRun
Import.pack(side="left", padx = 5, pady = 10)
Load = Tk.Button(botLeftFrame)
Load["text"] = "Load"
Load["command"] = self.loadRun
Load.pack(side="left", padx = 5, pady = 10)
self.var = Tk.StringVar()
fileStore = open("PastRuns.txt","r")
self.files = []
for line in fileStore:
self.files.append(line.rstrip("\n"))
fileStore.close()
Menu = Tk.OptionMenu(botLeftFrame, self.var, *self.files)
self.var.set("None selected")
Menu.pack(side="left", padx = 5, pady = 10)
Home = Tk.Button(botLeftFrame, text="Home",command=lambda: controller.show_frame(createHome))
Home.pack(side="left", padx = 5, pady = 10)
topLeftFrame = Tk.Frame(leftFrame)
topLeftFrame.pack(side="top", expand = True, fill = "both")
img = Image.open("C:\Users\Jacob\workspace2\Blank2.png")
blkImg = ImageTk.PhotoImage(img)
self.ImageViewer = Tk.Label(topLeftFrame, image = blkImg)
self.ImageViewer.image = blkImg
self.ImageViewer.pack(side = "left", padx = 5, pady = 10)
rightFrame = Tk.Frame(self, bg = "white")
rightFrame.pack(side="right", padx = 5, pady = 10)
self.alphaCount = 0
self.betaCount = 0
self.gammaCount = 0
self.alphaText = Tk.StringVar()
self.betaText = Tk.StringVar()
self.gammaText = Tk.StringVar()
self.alphaText.set("Alpha: 0")
self.betaText.set("Beta: 0")
self.gammaText.set("Gamma: 0")
self.alpha = Tk.Label(rightFrame, textvariable = self.alphaText, bg = "white")
self.alpha.pack(side="top", padx = 5, pady = 5)
self.beta = Tk.Label(rightFrame, textvariable = self.betaText, bg = "white")
self.beta.pack(side="top", padx = 5, pady = 5)
self.gamma = Tk.Label(rightFrame, textvariable = self.gammaText, bg = "white")
self.gamma.pack(side="top", padx = 5, pady = 5)
def importRun(self):
user = getuser()
filename = askopenfilename(title = "Choose a new Image to import", initialdir='C:/Users/%s' % user)
newImg = Image.open(filename)
newPhoImg = ImageTk.PhotoImage(newImg)
self.Image.configure(image=newPhoImg)
self.Image.image = newPhoImg
self.files.append(filename)
self.Menu['menu'].delete(0, 'end')
fileStore = open("PastRuns.txt","w")
for f in self.files:
self.Menu["menu"].add_command(label=f, command=Tk._setit(self.var, f))
fileStore.write(f+"\n")
fileStore.close()
self.analyseImage(imPath=filename)
self.circleCheck(imPath=filename)
def loadRun(self):
selection = self.var.get()
if selection == "None selected" :
tkMessageBox.showinfo("ERROR", "No file was selected")
else:
newImg = Image.open(selection)
newPhoImg = ImageTk.PhotoImage(newImg)
self.ImageViewer.configure(image=newPhoImg)
self.ImageViewer.image = newPhoImg
self.analyseImage(imPath=selection)
self.circleCheck(imPath=selection)
self.lineCheck(imPath=selection)
def analyseImage(self, imPath):
img = Image.open(imPath)
crop_rectangle = (34, 4, 1026, 562)
cropped_img = img.crop(crop_rectangle)
grey = cropped_img.convert('L')
bw = np.asarray(grey).copy()
#Makes the image black OR white
bw[bw < 128] = 0
bw[bw >= 128] = 255
lbl, nlbls = label(bw)
labels = range(1, nlbls + 1)
coords = [np.column_stack(np.where(lbl == k)) for k in labels]
for i in range(0, nlbls):
if len(coords[i]) <= 20:
self.gammaCount += 1
self.gammaText.set("Gamma: " + str(self.gammaCount))
self.gammaCount = 0
imfile = Image.fromarray(bw)
def circleCheck(self, imPath):
image = cv2.imread(imPath)
image = cv2.medianBlur(image,5)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
if circles != None:
self.alphaCount = len(circles)
else:
self.alphaCount = 0
self.alphaText.set("Alpha: " + str(self.alphaCount))
self.alphaCount = 0
def lineCheck(self, imPath):
image = cv2.imread(imPath)
image = cv2.medianBlur(image,5)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 10
maxLineGap = 1
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
self.betaCount = len(lines)
self.betaText.set("Beta: " + str(self.betaCount))
self.betaCount = 0
class createAnalyse(Tk.Frame):
def __init__(self, parent, controller):
Tk.Frame.__init__(self,parent)
app = Application()
app.mainloop()
看起来您从另一个答案中复制了很多这段代码,但遗漏了一个关键步骤。您似乎没有在任何帧上调用pack、place或grid。你需要这样做才能让他们看得见 你是对的,我复制了第一个类的大部分,但是如果我在for循环中插入'frame.pack',它只会将所有表单加载到1中frame@JacobM:对。您需要使用grid或place,这允许您堆叠小部件。使用网格,并将它们放在同一行和同一列中,就像在您复制的代码中一样。在做了一些挖掘之后,我实现了我想要的,谢谢您的帮助。如果您发布您已经实现的解决方案,那将是非常有帮助的;我将不胜感激。谢谢是我用来帮助我的,它比我的代码清楚得多。请给出一个关于这个问题的最小代码示例