微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法让 tkinter Radiobutton 在 tkinter 画布上透明?

如何解决有没有办法让 tkinter Radiobutton 在 tkinter 画布上透明?

我想让单选按钮在画布图像上透明以使其看起来不错,我尝试将许多选项参数传递给单选按钮以某种方式使其看起来更好但没有任何效果

这是我正在使用的代码...

from tkinter import *
from tkinter import ttk
from tkinter.ttk import *
from PIL import ImageTk,Image
from tkinter import messageBox 


class GUI_Prog:
    def __init__(self):
            root = Tk()
            root.title("Risk Analysis")
            root.geometry("1100x630")
            r = Intvar()

            #Setting up Canvas :
            my_canvas = Canvas(root,width=1100,height=630)
            my_canvas.pack(fill="both",expand=True)

            #Background :
            img = Image.open("diagnosis.png")
            img = img.resize((1100,630),Image.ANTIALIAS)
            bg =  ImageTk.PhotoImage(img)
            my_canvas.create_image(0,image=bg,anchor="nw")

            #Creating title text :
            my_canvas.create_text(540,40,text="Risk Analysis",font=("Times,30"),fill = "white")
            my_canvas.create_text(140,100,text="1) Do you smoke?",font=("helvetica,15"),fill = "black")

            but_1 = Radiobutton(root,text="yes",variable=r,value=1)
            my_canvas.create_window(60,150,window=but_1)

            but_2= Radiobutton(root,text="no",value=2)
            my_canvas.create_window(150,window=but_2)

            mainloop()


obj = GUI_Prog()

解决方法

好吧,我创建了自己的 RadioButton 类,但它仅适用于 tkinter.Canvas

from tkinter import *
from tkinter import ttk
from tkinter.ttk import *
from PIL import ImageTk,Image
from tkinter import messagebox


# Taken from: https://stackoverflow.com/a/17985217/11106801
def _create_circle(self,x,y,r,**kwargs):
    return self.create_oval(x-r,y-r,x+r,y+r,**kwargs)
Canvas.create_circle = _create_circle


class Radiobutton:
    def __init__(self,canvas,text="",variable=None,value=0,radius=10,fill="black"):
        self.canvas = canvas
        self.variable = variable
        self.fill = fill
        self.text = text
        self.value = value
        self.radius = radius

        self.variable.trace("w",self.redraw)

        self.circle = None

    def put(self,y):
        self.x = x
        self.y = y
        self.canvas.create_circle(x,self.radius,outline=self.fill)
        self.canvas.create_text(x + 2*self.radius,text=self.text,fill=self.fill,anchor="w")
        self.redraw()
        self.canvas.bind("<Button-1>",self.select,add=True)

    def select(self,event):
        if (self.x - event.x)**2 + (self.y - event.y)**2 <= self.radius**2:
            self.variable.set(self.value)
            self.redraw()

    def create_circle(self):
        self.circle = self.canvas.create_circle(self.x,self.y,self.radius-4,outline=self.fill,fill=self.fill)

    def redraw(self,*args):
        if self.value == self.variable.get():
            if self.circle is None:
                self.create_circle()
        else:
            if self.circle is not None:
                self.canvas.delete(self.circle)
                self.circle = None


class GUI_Prog:
    def __init__(self):
            root = Tk()
            root.title("Risk Analysis")
            root.geometry("1100x630")
            r = IntVar()

            #Setting up Canvas:
            my_canvas = Canvas(root,width=1100,height=630)
            my_canvas.pack(fill="both",expand=True)

            #Background:
            img = Image.open("diagnosis.png")
            img = img.resize((1100,630),Image.ANTIALIAS)
            bg =  ImageTk.PhotoImage(img)
            my_canvas.create_image(0,image=bg,anchor="nw")

            #Creating title text:
            my_canvas.create_text(540,40,text="Risk Analysis",font=("Times",30),fill="white")
            my_canvas.create_text(140,100,text="1) Do you smoke?",font=("helvetica",15),fill="black")

            but_1 = Radiobutton(my_canvas,text="yes",variable=r,value=1,fill="white")
            but_1.put(60,150)

            but_2 = Radiobutton(my_canvas,text="no",value=2,fill="white")
            but_2.put(150,150)

            r.set(1)

            root.mainloop()


obj = GUI_Prog()

您可以正常创建它,但将 <tkinter.Canvas> 作为其 master 传入。之后,您只需使用您希望创建它的位置调用 .put。这是一个非常不完整的解决方案,所以如果其他人发布了更好的解决方案,我会删除它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。