Python Tkinter画布类继承 [英] Python Tkinter canvas class inheritance

查看:82
本文介绍了Python Tkinter画布类继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Tkinter 8.6,Python 3.7.3:

这里一个友好的用户通过创建 Imgbutton 类(它是Tkinter Canvas 的子类)的方式指导我如何使图像像按钮一样./p>

我对此代码有一些疑问,这是它的简化版本:

 #!/usr/local/bin/python3将tkinter导入为tk从PIL导入Image,ImageTkImgbutton(tk.Canvas)类:def __init __(self,master = None,image = None,command = None,** kw):超级(Imgbutton,self).__ init __(master = master,** kw) 

  self.set_img = self.create_image(0,0,锚='nw',image = image) 

  self.bind_class(s​​elf,'< Button-1>',lambda _:self.config(relief ='sunken'),add ="+")self.bind_class(s​​elf,'< ButtonRelease-1>',lambda _:self.config(relief ='groove'),add ='+')self.bind_class(s​​elf,'< Button-1>',lambda _:command()如果命令为else,则无,添加="+") 

问题:

  1. 当我创建一个 Imgbutton 对象时,上面的分隔行被执行,但是我不明白为什么.
  2. self.set_img 是否对应于 Imgbutton tk.Canvas 类的对象?
  3. 在这里是否有任何地方可以创建实际的画布?我相信您需要先创建一个画布,然后才能向其中添加任何内容.


这部分可能不需要提及,但是在这里我要创建一个 Imgbutton 对象:

  root = tk.Tk()but_img = tk.PhotoImage(file ='button.png')但是= Imgbutton(root,image = but_img,width = but_img.width(),height = but_img.height(),borderwidth = 2,highlightthickness = 0)但是.pack()root.mainloop() 

解决方案

当我创建一个Imgbutton对象时,上面的分隔行被执行,但是我不明白为什么.

它被执行,因为它是代码的一部分.我不确定为什么您会认为它不会被调用.如果不想调用它,请将其移到 __ init __ 方法之外.

self.set_img是否对应于Imgbuttonor tk.Canvas类的对象?

self 是指 Imgbutton 类的实例. set_img 是画布在画布上创建对象时返回的标识符.

在这里是否可以创建实际的画布?

是的. Imgbutton 是画布.这就是继承的工作方式: Imgbutton Canvas ,具有一些增强功能.它是在您执行 but = Imgbutton(...)时创建的.但是,当您调用 super 时,可能会更准确地创建实际的画布,这告诉tkinter创建对象.

Using Tkinter 8.6, Python 3.7.3:

A friendly user here instructed me on how to have an image act like a button by the way of creating an Imgbutton class that is a subclass of Tkinter Canvas.

I have some questions regarding this code, here is the simplified version of it:

#!/usr/local/bin/python3

import tkinter as tk
from PIL import Image, ImageTk

class Imgbutton(tk.Canvas):

    def __init__(self, master=None, image=None, command=None, **kw):

        super(Imgbutton, self).__init__(master=master, **kw)

        self.set_img = self.create_image(0, 0, anchor='nw', image=image)

        self.bind_class( self, '<Button-1>',
                    lambda _: self.config(relief='sunken'), add="+")

        self.bind_class( self, '<ButtonRelease-1>',
                    lambda _: self.config(relief='groove'), add='+')

        self.bind_class( self, '<Button-1>',
                    lambda _: command() if command else None, add="+")

Questions:

  1. When I create an Imgbutton object, the separated line above gets executed but I do not understand why.
  2. Does the self.set_img correspond to an object of Imgbuttonor tk.Canvas class?
  3. Is there any point here where an actual canvas is created? I believed you need to create a canvas before you can add anything to it.


This part might be unneccessary to mention but here I am creating an Imgbuttonobject:

root = tk.Tk()

but_img = tk.PhotoImage(file='button.png')

but = Imgbutton(root, image=but_img, width=but_img.width(),
            height=but_img.height(), borderwidth=2, highlightthickness=0)
but.pack()

root.mainloop()

解决方案

When I create an Imgbutton object, the separated line above gets executed but I do not understand why.

It's executed because it's part of the code. I'm not sure why you think it wouldn't be called. If you don't want it to be called, move it outside of the __init__ method.

Does the self.set_img correspond to an object of Imgbuttonor tk.Canvas class?

self refers to the instance of the Imgbutton class. set_img will be the identifier returned by the canvas when it creates the object on the canvas.

Is there any point here where an actual canvas is created?

Yes. Imgbutton is the canvas. That is how inheritance works: Imgbutton is a Canvas, with some enhancements. It gets created when you do but = Imgbutton(...). Though, perhaps a bit more accurately the actual canvas is created when you call super, which tells tkinter to create the object.

这篇关于Python Tkinter画布类继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆