使用 Tkinter 的 GUI 应用程序 - 拖放

Posted

技术标签:

【中文标题】使用 Tkinter 的 GUI 应用程序 - 拖放【英文标题】:GUI application using Tkinter - Drag and Drop 【发布时间】:2012-04-13 07:40:54 【问题描述】:

我最近一直在使用 WxPython 创建一个 GUI 网络模拟器,例如 Cisco 数据包跟踪器,但老实说,尝试找到我需要的示例等非常困难。我求助于旧的忠实 Tk。

到目前为止,我的程序有一个菜单栏,其中包含一个文件 > 退出。它还在应用程序的右下角有一个退出按钮。除此之外,它还有一个设定大小的画布和各种按钮,单击这些按钮会在画布上生成一个硬件的小图像。这是使用 PIL 完成的

接下来我需要能够在画布上拖动这些图像,但事实证明这有点困难。我查看了以下示例,说明它是如何分解的,我有点理解您如何需要点击定义、动作(从 a 到 b)和发布定义,但是如何将它应用到我的代码中我已经有了?

这是我上面引用的链接: http://www.python-forum.org/pythonforum/viewtopic.php?f=4&p=75789

最后这是我已经拥有的代码。我可以理解我的代码的布局和结构不是很好,因为我对编程还很陌生,但是任何指导/示例/视觉表示都会很棒。

  from Tkinter import*
from PIL import Image, ImageTk
class AllTkinterWidgets:
    def __init__(self, master):
        frame= Frame(master, width=900, height=600)
        frame.pack()

        iframe5 = Frame (frame, bd=2, relief=RAISED)
        iframe5.pack(expand=1, fill=X, pady=10, padx=5)

        c = Canvas(iframe5, bg='white', width=600, height=500)
        c.pack()

    # definitions to print hardware images to the canvas
    # -----------------------------------------------------------------------
        def show_imageRouter():
            c.create_image(30,30, image=image1)

        def show_imageSwitch():
            c.create_image(30,60, image=image2)

        def show_imageServer():
            c.create_image(30,100, image=image3)

        def show_imageIpPhone():
            c.create_image(30,140, image=image4)

        def show_imageWirelessRouter():
            c.create_image(30,180, image=image5)

        def show_imageHost():
            c.create_image(30, 220, image=image6)

    # Network hardware buttons created
    # ----------------------------------------------------
        self.button = Button(frame, text = "Router", height= 1, width= 8, padx=2, pady=2,command=show_imageRouter)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "Switch",height= 1, width= 8, padx=2, pady=2, command=show_imageSwitch)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "Server",height= 1, width= 8, padx=2, pady=2, command=show_imageServer)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "IP Phone",height= 1, width= 8, padx=2, pady=2, command=show_imageIpPhone)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "Wireless Router",height= 1, width= 12, padx=2, pady=2, command=show_imageWirelessRouter)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "Host",height= 1, width= 8, padx=2, pady=2, command=show_imageHost)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "Cabling",height= 1, width= 8, padx=2, pady=2)
        self.button.pack(side = LEFT)

        self.button = Button(frame, text = "Square",height= 1, width= 8, padx=2, pady=2)
        self.button.pack(side = LEFT)

    # Create the image objects for the hardware Images
    # ----------------------------------------------------------------------
        imageFile = "router.png"
        image1 = ImageTk.PhotoImage(Image.open(imageFile))

        imageFile = "switch.png"
        image2 = ImageTk.PhotoImage(Image.open(imageFile))

        imageFile = "Server.png"
        image3 = ImageTk.PhotoImage(Image.open(imageFile))

        imageFile = "ipPhone.png"
        image4 = ImageTk.PhotoImage(Image.open(imageFile))

        imageFile = "WirelessRouter.png"
        image5 = ImageTk.PhotoImage(Image.open(imageFile))

        imageFile = "Host.png"
        image6 = ImageTk.PhotoImage(Image.open(imageFile))

root = Tk()
all = AllTkinterWidgets(root)

def Exit():
    print "Exit"

# Create an Exit Button
toolbar = Frame(root)
b = Button(toolbar, text="Exit", width=6, height=3, command=Exit)
b.pack(side=RIGHT, padx=2, pady=2)
toolbar.pack(side=BOTTOM, fill=X)

# Press Esc to quit
root.bind("<Escape>", exit)

# Creation of a menu File > Exit
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="Exit", command=Exit)

root.mainloop()

抱歉,缩进有点奇怪。我已经对其进行了调整,使其在这里块在一起。

【问题讨论】:

【参考方案1】:

This answer 对问题“移动椭圆的板绘图代码”显示了如何在画布上拖动对象。

【讨论】:

以上是关于使用 Tkinter 的 GUI 应用程序 - 拖放的主要内容,如果未能解决你的问题,请参考以下文章

Python GUI编程(Tkinter)Scale控件

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

python桌面开发,为啥选择PyQt或wxPython,而不使用Tkinter?

❤️python入门项目使用 Tkinter 的 日历 GUI 应用程序❤️

❤️python入门项目使用 Tkinter 的 日历 GUI 应用程序❤️

使用Python3.6的标准GUI库tkinter快速创建GUI应用程序