图像不显示?

时间:2016-11-23 13:43:04

标签: python tkinter

它没有编码错误。它只是没有显示图像。

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        image = tkinter.PhotoImage(file="NORTHERNICE (1).gif")
        #../Documents/
        tkinter.Label(self, image=image).pack()
        start = Button(self, text ="Choose a class", fg="#a1dbcd", bg="#383a39", command = lambda: controller.show_frame('PageOne'), font=("Gisha", 10))
        start.pack()

1 个答案:

答案 0 :(得分:0)

Tkinter有点不寻常的野兽,因为这里涉及两种语言--Python(在其中编写代码)和Tcl(托管Tk用户界面工具包)。这两种环境之间的相互作用存在一些奇怪之处,你可能会遇到最明显的问题。具体来说,实际PhotoImage对象(完全位于Tcl端)的生命周期与充当其代理的Python PhotoImage对象之间没有正确的同步。目前,如果Python对象被垃圾收集,则会自动删除Tcl对象,即使可能仍然存在对图像的Tcl端引用。这样做的结果是,您不能仅使用局部变量(如代码中的private VBox Chat(){ VBox chat = new VBox(); chat.setPrefSize(400, 400); chat.setStyle("-fx-background-color:#333333;"); Label txt1 = new Label("Text1"); txt1.setTextFill(Color.WHITE); txt1.setPrefWidth(400); txt1.setAlignment(Pos.CENTER_LEFT); Label txt2 = new Label("Text2"); txt2.setTextFill(Color.WHITE); txt2.setPrefWidth(400); txt2.setAlignment(Pos.CENTER_RIGHT); chat.getChildren().addAll(txt1,txt2); return chat; } )来对图像进行Python引用,因为它将在函数末尾消失。将图像存储在全局变量中会起作用,但可能会使图像的生命周期太长(即使使用它的窗口已关闭,它也永远不会被删除)。将它作为实例变量存储将起作用(在您的情况下为image而不是self.image),因为Python实例可能与它描述的Tcl小部件完全一样长。另一个流行的选择是将图像存储为使用图像的窗口小部件的属性。