tkinter python gui背景没有显示

时间:2017-03-27 17:42:01

标签: python user-interface tkinter background

我的基本问题是试图让我的背景显示出来。

它加载并显示不包含额外代码但是一旦我尝试在循环中运行其他一些进程,后台就会停止加载/显示

进一步的背景是我已经为我的学位项目生成了运行批处理的代码。当我试图在这个尝试Tkinter时加入一个GUI时,请记住这对我来说是全新的,所以也许在搜索类似问题/整改时我错过了几点。

因为我正在尝试构建GUI学习,所以我尝试了一个非常基本的东西来构建,如下所示:

import time
from tkinter import *
import tkinter as Tk   ## notice lowercase 't' in tkinter here

root = Tk.Tk()
root.wm_geometry("1024x768")
root.title('Rpi Automated MicroBrewery')

a = StringVar()
a.set("1234")

text1 = StringVar()
text1.set("Header Full")

def startBrew():
    print('brew has started')

def a():
    print('a')
def b():
    print('b')
def c():
    print('c')

def main():
    a()
    b()
    c()

class Application(Tk.Frame):
    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.createWidgets()

    def createWidgets(self):

        background_image = Tk.PhotoImage(file="C:\\Users\\chris\\Documents\\Uni\\Year Four\\Final Year Project\\bg.png")
        self.background_label = Tk.Label(root, image=background_image).place(x=0, y=0, relwidth=1, relheight=1)

        self.startButton = Tk.Button(root, text="Start Brewing!", command=startBrew).place(x=200,y=200)
        self.parametersButton = Tk.Button(root, text="Brewing Parameters", command=Application.parametersWindow).place(x=300,y=300)

        self.headerTemp = Tk.Label(root, textvariable=a).place(x=500,y=500)
        self.headerLev = Tk.Label(root, textvariable=text1).place(x=500,y=600)

        self.onUpdate()

    def parametersWindow():
        top = Toplevel()
        top.maxsize(400,400)
        top.title("Adjust Brew Parameters")
        about_message = "put some parameters in here"

        msg = Message(top, text=about_message).place(x=0,y=0)

        button = Button(top, text="Dismiss", command=top.destroy)

    def onUpdate(self):
        main()
        self.after(1000, self.onUpdate)

app = Application(master=root)
root.mainloop()

请仔细检查并纠正必要的地方。但请记住,这对我来说是全新的,如果答案太复杂,可能会过头。还有任何想法为什么text1字符串var显示,但我根本无法显示'a'。

我已经尝试了这个,但它运行main()直到取消,然后允许显示背景和GUI。请帮助我确定一个简单的规则我不跟随:

    import time
from tkinter import *
import tkinter as tk   ## notice lowercase 't' in tkinter here

root = tk.Tk()
root.wm_geometry("1024x768")
root.title('Rpi Automated MicroBrewery')

a = StringVar()
a.set("1234")

text1 = StringVar()
text1.set("Header Full")

def startBrew():
    print('brew has started')

def a():
    print('a')
def b():
    print('b')
def c():
    print('c')

def main():
    a()
    b()
    c()
    root.after(5000, main())

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.createWidgets()

    def createWidgets(self):

        self.startButton = tk.Button(root, text="Start Brewing!", command=startBrew).place(x=200,y=200)
        self.parametersButton = tk.Button(root, text="Brewing Parameters", command=Application.parametersWindow).place(x=300,y=300)

        self.headerTemp = tk.Label(root, textvariable=a).place(x=500,y=500)
        self.headerLev = tk.Label(root, textvariable=text1).place(x=500,y=600)

        self.onUpdate()

    def parametersWindow():
        top = Toplevel()
        top.maxsize(400,400)
        top.title("Adjust Brew Parameters")
        about_message = "put some parameters in here"

        msg = Message(top, text=about_message).place(x=0,y=0)

        button = Button(top, text="Dismiss", command=top.destroy)

    def onUpdate(self):
        main()
        self.after(5000,onUpdate)

background_image = tk.PhotoImage(file="C:\\Users\\chris\\Documents\\Uni\\Year Four\\Final Year Project\\bg.png")
background_label = tk.Label(root, image=background_image).place(x=0, y=0, relwidth=1, relheight=1)
app = Application(master=root)
root.mainloop()

由于

1 个答案:

答案 0 :(得分:0)

这是常见问题。您需要保留图像引用或收集垃圾。最简单的方法是通过添加“自我”使其成为实例变量。'到变量名:

self.background_image = Tk.PhotoImage(file="C:\\Users\\chris\\Documents\\Uni\\Year Four\\Final Year Project\\bg.png")
self.background_label = Tk.Label(root, image=self.background_image)
self.background_label.place(x=0, y=0, relwidth=1, relheight=1)

此外,如果您想避免将来的错误,请不要将布局放在与初始化相同的行上。将它分成两行,就像我上面那样。

要回答你的另一个问题," a"变量未显示,因为您定义了一个函数" a"后来在代码中覆盖了StringVar" a"。让这成为你不要使用单字母变量名的教训。始终使用描述性名称。