尝试创建一个弹出画布,当我按下某个键组合时会弹出,然后它会显示可以使用箭头键滚动的图像,然后使用转义键关闭。这都是在画布上绘制的,其上绘制了一个地图,我可以使用箭头键在地图上移动。由于我有很多相关的问题几乎是相互关联的,我想我会用一个帖子而不是单独的帖子来询问所有问题,将所有信息放在一个地方供其他人使用可能会非常方便。好。
目前,我已经尝试了几种方法来解决这个问题,我确实在几分钟之前看到另一种可能的选择,因为我今天早上上网了,但似乎并不想工作。
问题1:你在哪里形成弹出画布?在原来的
def __init__(self, parent):
或者您通常会等到切换到弹出窗口时形成弹出画布?我已经尝试了两种方法,并且看到了两种方法的问题。在启动时形成它会导致弹出窗口从弹出窗口弹出。我在effbot.org上看到,据说使用state ='hidden'属性存在,但当我尝试使用它时,我得到的是一个错误,表示我只能使用'禁用'或'正常'。
问题2:那么如果你想要使用弹出窗口,如果你在程序开始时创建弹出窗口而不是等到按下弹出键组合键,你怎么隐藏弹出窗口?
我已经尝试将弹出窗口调整为0x0,但我仍然在屏幕上看到单个像素,直到我按下组合键。
我已经尝试等到关键组合被点击以弹出弹出窗口并且工作正常,直到我准备好更改为第二张图像。
在effbot.org上,我看到并尝试了几种不同的组合来尝试'禁用'而不会破坏(我不想做)当弹出窗口出现时下方的画布。我遇到的麻烦是,当我按下箭头键时,下面的画布仍然具有焦点,它会移动地图而不是更改弹出的图像。我尝试了几种effbot组合......
self.canvas.config(state='disabled')
self.canvaspopup = Canvas(self, width=800, height=614)
self.canvaspopup.pack_propagate(0)
self.canvaspopup.place(x=284,y=52)
self.png = Label(self.canvaspopup)
self.png.pack()
self.canvaspopup.focus_set()
我也试过
self.canvas.bind('<FocusOut>')
self.canvaspopup.bind('<FocusIn>')
仍然没有运气,下面的画布仍然有焦点,我仍然在移动地图而不是在弹出窗口中推进图像。我猜测它是在effbot.org上的Events and Bindings页面上,我看到FocusIn / Out正在讨论我应该把它放在.bind语句而不是.config中。
问题3:如何让弹出窗口获得焦点,几乎只需要键盘焦点而不需要鼠标对焦?
我知道我想保持弹出方便,因为我希望能够点击不同位置的底层地图,并让程序进入互联网并提取这些位置的数据,以便弹出窗口是这样的将在程序的任何一次运行中多次使用。我知道从我看到的我可以使用
self.canvaspopup.destroy()
但是这会破坏画布,所以我必须重新创建它。所以如果我把弹出创建放在程序的开头......我搞砸了,无法重新创建它。这导致回到问题2。
绝对一团糟。我有大多数工作正常,它只是互动,并知道处理这种情况的正确方法让我难过。
答案 0 :(得分:0)
由于您使用的是place
,因此可以使用place_forget
隐藏弹出窗口。对于焦点,您使用focus_set
。
以下是一个例子:
import tkinter as tk
class PopupCanvas(tk.Canvas):
def __init__(self, parent, *args, **kwargs):
tk.Canvas.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.text_item=self.create_text(10, 10, anchor="nw")
self.bind("<Left>", self.handle_left)
self.bind("<Right>", self.handle_right)
self.bind("<Escape>", self.hide)
def handle_left(self, event=None):
self.itemconfigure(self.text_item, text="You clicked left")
def handle_right(self, event=None):
self.itemconfigure(self.text_item, text="You clicked right")
def show(self, event=None):
self.place(relx=.5, rely=.5, anchor="center")
self.focus_set()
def hide(self, event=None):
self.place_forget()
self.parent.focus_set()
root = tk.Tk()
label = tk.Label(root, text="Press 'p' to pop up a canvas, <escape> to hide it\n" +
"Press left and right arrows when the popup is visible")
canvas = tk.Canvas(root, width=400, height=400)
popup = PopupCanvas(canvas, width=200, height=200, background="pink")
label.pack(side="top", fill="x")
canvas.pack(side="top", fill="both", expand=True)
canvas.focus_set()
canvas.bind("<p>", popup.show)
root.mainloop()