代码之家  ›  专栏  ›  技术社区  ›  FLCL

Python Tkinter。将BMP文件作为画布打开

  •  0
  • FLCL  · 技术社区  · 7 年前

    我试图使用tkinter从Python GUI加载BMP文件作为画布。我可以访问我的当前目录并选择我想要的文件,但我只能加载我在Window类之外指定的文件(在下面的代码中指定)。

    http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html

    这是我的代码:

    import tkinter as tk
    from tkinter import *
    from tkinter import filedialog
    from PIL import Image, ImageTk
    import os
    
    class Window(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
    
            self.master = master
            self.pos = []
            self.master.title("BMP Image GUI")
            self.pack(fill=BOTH, expand=1)
    
            self.counter = 0
    
            menu = Menu(self.master)
            self.master.config(menu=menu)
    
            file = Menu(menu)
            file.add_command(label="Exit", command=self.client_exit)
            file.add_command(label="Open", command=self.openFile)
            menu.add_cascade(label="File", menu=file)
            analyze = Menu(menu)
    
            menu.add_cascade(label="Analyze", menu=analyze)
    
        def client_exit(self):
            exit()
    
        #Where I open my file
        def openFile(self):
            self.filename = filedialog.askopenfilename(initialdir=os.getcwd(), 
     title="Select BMP File", filetypes=[("BMP Files","*.bmp")])
            load = Image.open(self.filename)
            render = ImageTk.PhotoImage(load)
    
            img = Label(self, image=render)
            img.image = render
            img.place(x=0, y=0)
            w, h = load.size
    
            canvas = Canvas(root, width=w, height=h)
            canvas.create_image((w / 2, h / 2), image=tkimage)
            canvas.pack()
    
            root.geometry("%dx%d" % (w, h))
    
    root = tk.Tk()
    
    imgSize = Image.open("ap41.ddr.brf.sdat.bmp") # The only file the loads
    tkimage = ImageTk.PhotoImage(imgSize)
    w, h = imgSize.size
    
    canvas = Canvas(root, width=w, height=h)
    
    root.geometry("%dx%d" % (300, 300))
    app = Window(root)
    root.mainloop()
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Novel    7 年前
    • 不使用通配符导入( from module import * ). 它会导致错误,并与PEP8背道而驰
    • 不要使用 quit() exit()
    • 不要使用“file”作为变量名,因为它是python2中的内置名称。
    • self.master = master
    • 你需要创建小部件 一旦

    -

    import tkinter as tk
    from tkinter import filedialog
    from PIL import Image, ImageTk
    import os
    
    class Window(tk.Frame):
        def __init__(self, master=None):
            tk.Frame.__init__(self, master)
    
            menu = tk.Menu(self.master)
            master.config(menu=menu)
    
            file_menu = tk.Menu(menu)
            file_menu.add_command(label="Exit", command=self.quit)
            file_menu.add_command(label="Open", command=self.openFile)
            menu.add_cascade(label="File", menu=file_menu)
            analyze = tk.Menu(menu)
    
            menu.add_cascade(label="Analyze", menu=analyze)
    
            self.canvas = tk.Canvas(self)
            self.canvas.pack(fill=tk.BOTH, expand=True)
            self.image = None # none yet
    
        #Where I open my file
        def openFile(self):
            filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select BMP File", filetypes=[("BMP Files","*.bmp")])
            if not filename:
                return # user cancelled; stop this method
    
            load = Image.open(filename)
            w, h = load.size
            self.render = ImageTk.PhotoImage(load) #must keep a reference to this
    
            if self.image is not None: # if an image was already loaded
                self.canvas.delete(self.image) # remove the previous image
    
            self.image = self.canvas.create_image((w / 2, h / 2), image=self.render)
    
            root.geometry("%dx%d" % (w, h))
    
    root = tk.Tk()
    root.geometry("%dx%d" % (300, 300))
    root.title("BMP Image GUI")
    app = Window(root)
    app.pack(fill=tk.BOTH, expand=1)
    root.mainloop()