【问题标题】:Overlaying a tkinter widget on an image frame在图像框架上覆盖 tkinter 小部件
【发布时间】:2018-07-13 10:36:23
【问题描述】:

我有一个应用程序,我必须在单击按钮时弹出一个Spinbox 小部件。小部件需要覆盖在作为图像的背景上。我已尝试使用下面的代码,但单击按钮时未出现小部件。我相信图像显示优先于小部件显示。

import tkinter as tk
import cv2
from PIL import Image,ImageTk
top = tk.Tk()
count = 1
image = cv2.imread("frames/0.jpg")
w = tk.Spinbox(top, from_=0, to=10)
def helloCallBack():
    global count,w
    if count%2 != 0:
        w.pack()

    else:
        w.forget()

    print(count)    
    count+=1


B = tk.Button(top, text ="Hello", command = helloCallBack)

B.pack()

label = tk.Label(top)
label.pack()

img = Image.fromarray(image)
imgtk = ImageTk.PhotoImage(image=img)
label.imgtk = imgtk
label.configure(image=imgtk)
top.update()

top.mainloop()

【问题讨论】:

  • 但是如果图片更新了,比如播放视频,情况就不好了
  • 您的意思是:您希望图像显示为旋转框的背景?
  • 不,我想要的是,当我按下按钮时,旋转框应该覆盖在背景之上(无论是图像还是视频),并且应该保持覆盖状态,直到我按下按钮再次。我有一个在 tkinter 帧中播放的视频,有时它需要我引入一些瞬时延迟,为此我使用 spinbox 提供延迟。目前,当我按下按钮时,旋转框没有出现。

标签: python python-3.x tkinter tk


【解决方案1】:

不知道是不是你想要的效果:

我使用place() 和place_forget() 来实现:

import tkinter as tk
import cv2
from PIL import Image,ImageTk


top = tk.Tk()
count = 1

def helloCallBack():
    global count,w
    if count%2 != 0:        
        w.place(x=180, y=650)
    else:
        w.place_forget()

    print(count)    
    count+=1

B = tk.Button(top, text ="Hello", command = helloCallBack)
B.pack()

label = tk.Label(top)
label.pack()

image = cv2.imread("frames/0.jpg")
img = Image.fromarray(image)
imgtk = ImageTk.PhotoImage(image=img)
label.imgtk = imgtk
label.configure(image=imgtk)

w = tk.Spinbox(top, from_=0, to=10)

top.update()

top.mainloop()

【讨论】:

  • 谢谢,这正是我要找的,但您能否详细说明为什么以前的代码不起作用?是图像优先于旋转框小部件吗?
  • 之前的代码不起作用,因为您使用了pack() 几何管理器,默认情况下(如您的情况),它按照打包顺序从上到下堆叠小部件。您在标签之后打包了旋转框,这是预期的结果。如果您使用grid(),您将得到相同的结果,因此place() 是您在这里唯一的朋友,这是place() 比pack() 和grid() @shubhamjaiswal 更有用的罕见情况之一跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
相关资源
最近更新 更多