它没有编码错误。它只是没有显示图像。
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()
答案 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小部件完全一样长。另一个流行的选择是将图像存储为使用图像的窗口小部件的属性。