使用弹出画布

时间:2017-04-26 16:22:12

标签: python-3.x tkinter

尝试创建一个弹出画布,当我按下某个键组合时会弹出,然后它会显示可以使用箭头键滚动的图像,然后使用转义键关闭。这都是在画布上绘制的,其上绘制了一个地图,我可以使用箭头键在地图上移动。由于我有很多相关的问题几乎是相互关联的,我想我会用一个帖子而不是单独的帖子来询问所有问题,将所有信息放在一个地方供其他人使用可能会非常方便。好。

目前,我已经尝试了几种方法来解决这个问题,我确实在几分钟之前看到另一种可能的选择,因为我今天早上上网了,但似乎并不想工作。

问题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。

绝对一团糟。我有大多数工作正常,它只是互动,并知道处理这种情况的正确方法让我难过。

1 个答案:

答案 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()