Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将python tkinter窗口添加为类,但无法显示任何类_Python_Forms_Tkinter - Fatal编程技术网

将python tkinter窗口添加为类,但无法显示任何类

将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, **

我一直在使用tkinter为粒子探测器创建图像分析仪。完成主窗体后,我决定需要几个其他的“窗口”或与我习惯的VB“窗体”关联。我发现这样做的方法是为每个“表单”使用类,但是在这样做之后,我无法让它们中的任何一个显示出来,只有一个空的Tk窗口。以下是我的代码,如有任何帮助,将不胜感激:

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,这允许您堆叠小部件。使用网格,并将它们放在同一行和同一列中,就像在您复制的代码中一样。在做了一些挖掘之后,我实现了我想要的,谢谢您的帮助。如果您发布您已经实现的解决方案,那将是非常有帮助的;我将不胜感激。谢谢是我用来帮助我的,它比我的代码清楚得多。请给出一个关于这个问题的最小代码示例