Tkinter 캔버스 개체를 비활성화하는 방법

VRage

내 프로젝트에서 나는 이미지로 배경 gif와 함께 Tkinter 버튼을 사용했습니다. 이제 base64 문자열로 지정된 "아이콘"을 추가해야합니다. Tkinter Button아이콘 또는 두 번째 이미지를 추가하는 옵션을 제공하지 않습니다. 그래서 canvas. 아래 코드 :

from Tkconstants import DISABLED
from Tkinter import Tk, Canvas
import Tkinter
import base64

import ImageTk


_FONTCOLOR = "#FFFFFF"
_BGCOLOR = "#787878"
_ICONDATA = '''iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZ
 G9iZSBJbWFnZVJlYWR5ccllPAAAAUJJREFUeNrsVc1qhDAQHq20FnRP7kF68iB9D+99Dp/J5+jdR9Bz8VwU
 PChbQbdo00yYLLuSrW4x9NKBjy+RL5nMZ34MxhjoDBM0h/YExoy3DCYnRtxx3BMbV8QTxxdVvaT7JGYWiV2
 OPbE1GywH9RwDh83xqEiCupHjg6Mmnixa+T5JkrelmuM4fimK4nVJF4bhM6cjLkqWu1vp69P8Q9u2MI7j/P
 OO5hV+yn9wEVEUqRI8yAZOmuc5NE0DWZbBMAznupN95o276KQryxI8z4MgCMD3fajrWqn79Tnoug5c1xVtZ
 LRq04Om8H3bBI7jQN/3oo2M/U0ToO9VVQlrkLH/UwJ2y/HHsG0b97vYRcjYV+mss5N6EWmaqhIc5zZdsWaS
 SUzqHFZW8L5Sd5CLNqgKbXeR9ttU/3vw/yb/eYJvAQYA4v5708p9noAAAAAASUVORK5CYII='''


class DesktopBtn(Tkinter.Button):

    def __init__(self, parent, buttonName, connector=None, **options):
        '''
        @param buttonName: Name of the button

        '''
        Tkinter.Button.__init__(self, parent, **options)
        self._imagePath = 'button.gif'
        self._BtnPresspath = 'buttonP.gif'
        self._BtnPressImage = Tkinter.PhotoImage(file=self._BtnPresspath)
        self._image = Tkinter.PhotoImage(file=self._imagePath)
        self.bind('<ButtonPress-1>', self._on_pressed)
        self.bind('<ButtonRelease-1>', self._on_release)
        self._parent = parent
        self._btnName = buttonName
        self._connector = connector
        self.config(width=70,
                    height=65,
                    borderwidth=0,
                    compound=Tkinter.CENTER,
                    font=("Arial", 9, "bold"),
                    foreground=_FONTCOLOR,
                    activebackground=_BGCOLOR,
                    text=buttonName,
                    wraplength=64,
                    image=self._image,
                    command=self._onClickSwitch,
                    state="disabled")

    def _on_pressed(self, event):
        if self.cget("state") != "disabled":
            self.config(relief="flat")
            self.config(image=self._BtnPressImage)

    def _on_release(self, event):
        if self.cget("state") != "disabled":
            self.config(image=self._image)

    def _onClickSwitch(self):
        self.config(relief="flat")
        if self._connector:
            self._connector.switchDesktop(self._btnName,
                                          "test")

    def getButtonName(self):
        return self._btnName

    def setConnector(self, connector):
        self._connector = connector


class CustomButton(Canvas):
    def __init__(self, parent, buttonname=None, icon=None, command=None):
        Canvas.__init__(self, parent, borderwidth=0, highlightthickness=0)
        self.command = command
        self._imagePath = 'button.gif'
        self._BtnPresspath = 'buttonP.gif'
        self._icon = icon
        self._BtnPressImage = Tkinter.PhotoImage(file=self._BtnPresspath)
        self._image = Tkinter.PhotoImage(file=self._imagePath)
        self.bgimage = self.create_image(35, 35, image=self._image)
        self.text = buttonname
        if self._icon:
            self._icondata = base64.b64decode(self._icon)
            self._iconimage = ImageTk.PhotoImage(data=self._icondata)
            self.create_image(35, 35, image=self._iconimage)
        if self.text and self._icon:
            self.create_text(35, 63, anchor="s",
                             state=DISABLED,
                             text=self.text,
                             font=("arial", 9, "bold"),
                             fill=_FONTCOLOR)
        elif not self._icon:
            self.create_text(35, 45, anchor="s",
                             state=DISABLED,
                             text=self.text,
                             font=("arial", 9, "bold"),
                             fill=_FONTCOLOR)
        self.configure(width=70, height=70, state=DISABLED)
#         if self.cget("state") == "disabled":
#             pass
#         else:
        self.bind("<ButtonPress-1>", self._on_press)
        self.bind("<ButtonRelease-1>", self._on_release)

    def _on_press(self, event):
        self.itemconfig(self.bgimage,image=self._BtnPressImage)
        print "pressed"

    def _on_release(self, event):
        self.itemconfig(self.bgimage,image=self._image)
        if self.command is not None:
            self.command()

tk = Tk()
but = DesktopBtn(tk, "test")
but.pack()
butt_blank = CustomButton(tk)
butt_text = CustomButton(tk, buttonname="test")
butt_icon = CustomButton(tk, icon=_ICONDATA)
butt_icon_text = CustomButton(tk, icon=_ICONDATA, buttonname="test")
butt_blank.pack()
butt_text.pack()
butt_icon.pack()
butt_icon_text.pack()
tk.mainloop()

첫 번째 버튼 (클래스)은 내가 사용했던 Tkinter 버튼입니다. 이제 나는 문제가 있습니다. 내 캔버스 사용자 정의 버튼을 일반 Tkinter Button. 회색으로 표시되고 마우스 이벤트를 무시해야합니다. create_image 또는 캔버스 개체 상태를 사용하는 Tkinter 8.5 참조 에 따르면 DISABLED내 사용자 지정 Button은 이전 Button처럼 동작해야합니다. Python 2.7을 사용하고 있습니다.

사용 된 버튼 이미지 (button.gif 및 buttonP.gif)는 다음과 같습니다. button.gif buttonP.gif

VRage

여기에 또 다른 해결 방법 rectangle이 있습니다. 다른 항목 위에 a 그려서 흰색으로 채우고 내 예제 stipple에서는 a Bitmap채우십시오 gray50.self.create_rectangle(-1,-1,70,70, stipple="gray50", fill="white")

코드는 다음과 같습니다.

from Tkconstants import DISABLED, NORMAL
from Tkinter import Tk, Canvas
import Tkinter
import base64

import ImageTk


_FONTCOLOR = "#FFFFFF"
_BGCOLOR = "#787878"
_ICONDATA = '''iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZ
 G9iZSBJbWFnZVJlYWR5ccllPAAAAUJJREFUeNrsVc1qhDAQHq20FnRP7kF68iB9D+99Dp/J5+jdR9Bz8VwU
 PChbQbdo00yYLLuSrW4x9NKBjy+RL5nMZ34MxhjoDBM0h/YExoy3DCYnRtxx3BMbV8QTxxdVvaT7JGYWiV2
 OPbE1GywH9RwDh83xqEiCupHjg6Mmnixa+T5JkrelmuM4fimK4nVJF4bhM6cjLkqWu1vp69P8Q9u2MI7j/P
 OO5hV+yn9wEVEUqRI8yAZOmuc5NE0DWZbBMAznupN95o276KQryxI8z4MgCMD3fajrWqn79Tnoug5c1xVtZ
 LRq04Om8H3bBI7jQN/3oo2M/U0ToO9VVQlrkLH/UwJ2y/HHsG0b97vYRcjYV+mss5N6EWmaqhIc5zZdsWaS
 SUzqHFZW8L5Sd5CLNqgKbXeR9ttU/3vw/yb/eYJvAQYA4v5708p9noAAAAAASUVORK5CYII='''


class DesktopBtn(Tkinter.Button):

    def __init__(self, parent, buttonName, connector=None, **options):
        '''
        @param buttonName: Name of the button

        '''
        Tkinter.Button.__init__(self, parent, **options)
        self._imagePath = 'button.gif'
        self._BtnPresspath = 'buttonP.gif'
        self._BtnPressImage = Tkinter.PhotoImage(file=self._BtnPresspath)
        self._image = Tkinter.PhotoImage(file=self._imagePath)
        self.bind('<ButtonPress-1>', self._on_pressed)
        self.bind('<ButtonRelease-1>', self._on_release)
        self._parent = parent
        self._btnName = buttonName
        self._connector = connector
        self.config(width=70,
                    height=65,
                    borderwidth=0,
                    compound=Tkinter.CENTER,
                    font=("Arial", 9, "bold"),
                    foreground=_FONTCOLOR,
                    activebackground=_BGCOLOR,
                    text=buttonName,
                    wraplength=64,
                    image=self._image,
                    command=self._onClickSwitch
                    )

    def _on_pressed(self, event):
        if self.cget("state") != "disabled":
            self.config(relief="flat")
            self.config(image=self._BtnPressImage)

    def _on_release(self, event):
        if self.cget("state") != "disabled":
            self.config(image=self._image)

    def _onClickSwitch(self):
        self.config(relief="flat")
        if self._connector:
            self._connector.switchDesktop(self._btnName,
                                          "test")

    def getButtonName(self):
        return self._btnName

    def setConnector(self, connector):
        self._connector = connector


class CustomButton(Tkinter.Canvas):
    def __init__(self, parent, buttonname=None, icon=None, command=None, **options):
        Tkinter.Canvas.__init__(self, parent, borderwidth=0, highlightthickness=0,**options)
        self.command = command
        self._imagePath = 'button.gif'
        self._BtnPresspath = 'buttonP.gif'
        self._icon = icon
        self._BtnPressImage = Tkinter.PhotoImage(file=self._BtnPresspath)
        self._image = Tkinter.PhotoImage(file=self._imagePath)
        self.bgimage = self.create_image(35, 35, image=self._image)
        self.text = buttonname
        if self._icon:
            self._icondata = base64.b64decode(self._icon)
            self._iconimage = ImageTk.PhotoImage(data=self._icondata)
            self.create_image(35, 35, image=self._iconimage)
        if self.text and self._icon:
            self.create_text(35, 63, anchor="s",
                             text=self.text,
                             font=("arial", 8, "bold"),
                             fill=_FONTCOLOR)
        elif not self._icon:
            self.create_text(35, 45, anchor="s",
                             text=self.text,
                             font=("arial", 8, "bold"),
                             fill=_FONTCOLOR)
        self.configure(width=70, height=70)
        self._activation()

    def disable(self):
        self.config(state=DISABLED)
        self._activation()

    def enable(self):
        self.config(state=NORMAL)
        self._activation()

    def _activation(self):
        if self.cget("state") == "disabled":
            self.create_rectangle(-1,-1,70,70, stipple="gray50", fill="white")
            self.unbind("<ButtonPress-1>")
            self.unbind("<ButtonRelease-1>")
        else:
            self.bind("<ButtonPress-1>", self._on_press)
            self.bind("<ButtonRelease-1>", self._on_release)

    def _on_press(self, event):
        self.itemconfig(self.bgimage, image=self._BtnPressImage)
        print "pressed"

    def _on_release(self, event):
        self.itemconfig(self.bgimage, image=self._image)
        if self.command is not None:
            self.command()

tk = Tk()
but = DesktopBtn(tk, "test")
but.config(state="disabled")
but.pack()
butt_blank = CustomButton(tk)
butt_text = CustomButton(tk, buttonname="test", state=DISABLED)
butt_icon = CustomButton(tk, icon=_ICONDATA)
butt_icon_text = CustomButton(tk, icon=_ICONDATA, buttonname="test")
butt_blank.pack()
butt_text.pack()
butt_icon.pack()
butt_icon_text.disable()
butt_icon_text.pack()
tk.mainloop()

결과는 거의 동일하지만이 "위젯"을 비활성화하고 활성화하는 두 가지 방법을 구현해야합니다. 그래서 나는 여전히 내 질문에 대한 해결책을 기다리고 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

두 캔버스 개체 Tkinter의 충돌을 감지하는 방법

분류에서Dev

Python Tkinter 캔버스에 텍스트를 맞추는 방법

분류에서Dev

tkinter 캔버스를 업데이트하는 방법?

분류에서Dev

Toplevel () Tkinter에서 캔버스를 사용하여 버튼을 만드는 방법

분류에서Dev

Tkinter에서 캔버스 내에서 텍스트를 이동하는 방법

분류에서Dev

Tkinter에서 마우스 포인터를 숨기거나 비활성화하는 방법은 무엇입니까?

분류에서Dev

체크 박스 후 div를 비활성화하는 방법

분류에서Dev

삭제를 사용하여 캔버스에서 개체를 제거하는 Tkinter

분류에서Dev

Tkinter 캔버스에 공 10 개 생성

분류에서Dev

Windrose를 플롯하는 Tkinter 캔버스

분류에서Dev

Linux 드라이버를 비활성화하는 방법

분류에서Dev

Nouveau 커널 드라이버를 비활성화하는 방법

분류에서Dev

크롬에서 디버거를 비활성화하는 방법

분류에서Dev

봄에 디버그 로그를 비활성화하는 방법

분류에서Dev

Django + Pythonanywhere : 디버그 모드를 비활성화하는 방법

분류에서Dev

캔버스에서 개체를 무작위로 복제하는 방법

분류에서Dev

Python 3.8을 사용하여 Tkinter에서 캔버스에 스크롤바를 만드는 방법

분류에서Dev

캔버스 크기에 맞게 tkinter 스크롤바 크기를 업데이트하는 방법

분류에서Dev

클래스를 사용하여 tkinter 캔버스에 다각형을 그리는 방법은 무엇입니까?

분류에서Dev

스타일 편집기를 비활성화하는 방법

분류에서Dev

낙타 케이스 경고를 비활성화하는 방법

분류에서Dev

Gradle 테스트에서 assert를 비활성화하는 방법

분류에서Dev

스프링 부트를 비활성화하는 방법 HibernateJpaAutoConfiguration

분류에서Dev

Python Tkinter의 항목 또는 입력 필드에서 텍스트를 희미하게 만들고 비활성화하는 방법

분류에서Dev

체크 박스를 클릭했을 때 div를 비활성화하는 방법

분류에서Dev

SetActive MY 개체를 부울 (비활성화 / 활성화)하는 방법

분류에서Dev

버튼 클릭 스타일 CSS를 비활성화하는 방법

분류에서Dev

ImageView를 자르는 캔버스 방법

분류에서Dev

tkinter 캔버스를 HTML 웹 페이지에 임베드하는 방법이 있습니까?

Related 관련 기사

  1. 1

    두 캔버스 개체 Tkinter의 충돌을 감지하는 방법

  2. 2

    Python Tkinter 캔버스에 텍스트를 맞추는 방법

  3. 3

    tkinter 캔버스를 업데이트하는 방법?

  4. 4

    Toplevel () Tkinter에서 캔버스를 사용하여 버튼을 만드는 방법

  5. 5

    Tkinter에서 캔버스 내에서 텍스트를 이동하는 방법

  6. 6

    Tkinter에서 마우스 포인터를 숨기거나 비활성화하는 방법은 무엇입니까?

  7. 7

    체크 박스 후 div를 비활성화하는 방법

  8. 8

    삭제를 사용하여 캔버스에서 개체를 제거하는 Tkinter

  9. 9

    Tkinter 캔버스에 공 10 개 생성

  10. 10

    Windrose를 플롯하는 Tkinter 캔버스

  11. 11

    Linux 드라이버를 비활성화하는 방법

  12. 12

    Nouveau 커널 드라이버를 비활성화하는 방법

  13. 13

    크롬에서 디버거를 비활성화하는 방법

  14. 14

    봄에 디버그 로그를 비활성화하는 방법

  15. 15

    Django + Pythonanywhere : 디버그 모드를 비활성화하는 방법

  16. 16

    캔버스에서 개체를 무작위로 복제하는 방법

  17. 17

    Python 3.8을 사용하여 Tkinter에서 캔버스에 스크롤바를 만드는 방법

  18. 18

    캔버스 크기에 맞게 tkinter 스크롤바 크기를 업데이트하는 방법

  19. 19

    클래스를 사용하여 tkinter 캔버스에 다각형을 그리는 방법은 무엇입니까?

  20. 20

    스타일 편집기를 비활성화하는 방법

  21. 21

    낙타 케이스 경고를 비활성화하는 방법

  22. 22

    Gradle 테스트에서 assert를 비활성화하는 방법

  23. 23

    스프링 부트를 비활성화하는 방법 HibernateJpaAutoConfiguration

  24. 24

    Python Tkinter의 항목 또는 입력 필드에서 텍스트를 희미하게 만들고 비활성화하는 방법

  25. 25

    체크 박스를 클릭했을 때 div를 비활성화하는 방법

  26. 26

    SetActive MY 개체를 부울 (비활성화 / 활성화)하는 방법

  27. 27

    버튼 클릭 스타일 CSS를 비활성화하는 방법

  28. 28

    ImageView를 자르는 캔버스 방법

  29. 29

    tkinter 캔버스를 HTML 웹 페이지에 임베드하는 방법이 있습니까?

뜨겁다태그

보관