PhotoImage Tkinter 问题:按钮不起作用且不显示

Posted

技术标签:

【中文标题】PhotoImage Tkinter 问题:按钮不起作用且不显示【英文标题】:PhotoImage Tkinter problem: Button not working and not displaying 【发布时间】:2022-01-14 14:59:51 【问题描述】:

我使用 Proxlight Designer 创建拖放式 GUI。这是一个适用于 open-cv-python 的应用程序,但未显示 Button。似乎 open-cv 是问题所在,因为如果将其删除,则 Button 会显示并正常工作。这是 GUI 的代码:

cap = cv2.VideoCapture(0)

window = Tk()
window.geometry("700x800")
window.configure(bg = "#ffffff")
canvas = Canvas(
    window,
    bg = "#ffffff",
    height = 800,
    width = 700,
    bd = 0,
    highlightthickness = 0,
    relief = "ridge")
canvas.place(x = 0, y = 0)

l1 = Label(bg = "black")
l1.place(x = 100, y = 150, width = 500, height = 500)

img0 = PhotoImage(file = f"RES/img1.png")
b0 = Button(
    image = img0,
    borderwidth = 0,
    highlightthickness = 0,
    command = save_face,
    relief = "flat")

b0.place(
    x = 250, y = 693,
    width = 200,
    height = 75)

img1 = PhotoImage(file = f"RES/img2.png")

b1 = Button(
    image = img1,
    borderwidth = 0,
    highlightthickness = 0,
    command = encryptPass,
    relief = "flat")

b1.place(
    x = 480, y = 693,
    width = 200,
    height = 75)

img2 = PhotoImage(file = f"RES/img3.png")
b2 = Button(
    image = img2,
    borderwidth = 0,
    highlightthickness = 0,
    command = generate_key,
    relief = "flat")

b2.place(
    x = 20, y = 693,
    width = 200,
    height = 75)

window.resizable(False, False)

while True:
    img = cap.read()[1]
    img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = ImageTk.PhotoImage(Image.fromarray(img1))
    l1["image"] = img
    window.update()

【问题讨论】:

不要使用place 完全没有必要,可能按钮隐藏在带有图像的标签之类的东西下,最好使用mainloop而不是@ 987654324@ 与update 循环,有一个after 方法用于“循环” 你在while循环中覆盖了img1,所以使用img1的按钮不起作用。其他两个按钮工作正常。与其他评论一样,在 tkinter 应用程序的主线程中应避免使用 while 循环。 【参考方案1】:

感谢@Matiiss 和@acw1668 的cmets(顺便说一句,谢谢),我让它工作了。基本上,while循环是问题所在。我使用它而不是 while 循环来修复它:

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

def show_frame():
    _, frame = cap.read()
    global cv2image
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    l1.imgtk = imgtk
    l1.configure(image=imgtk)
    l1.after(10, show_frame)

window = Tk()
window.geometry("700x800")
window.configure(bg = "#ffffff")

l1 = Label(bg = "black")
l1.place(x = 100, y = 150, width = 500, height = 500)

window.resizable(False, False)

show_frame()
window.mainloop()

【讨论】:

以上是关于PhotoImage Tkinter 问题:按钮不起作用且不显示的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter消失PhotoImage问题[重复]

Python Tkinter PhotoImage

Tkinter图片按钮

使用 Tkinter 在 GIF 中播放动画 [重复]

Python3 Tkinter基础 Text Photoimage 文本框中插入一张图片

有没有一种基于是否有人按下按钮(tkinter)的条件语句的方法