Есть ли способ сделать 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,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", variable=r, value=2)
            my_canvas.create_window(150, 150, window=but_2)

            mainloop()


obj = GUI_Prog()

person Shubham Shejaval    schedule 09.04.2021    source источник
comment
Я не совсем уверен, возможно ли это. Вы пытались использовать круги, чтобы создать свой собственный переключатель внутри tkinter.Canvas?   -  person TheLizzard    schedule 09.04.2021
comment
Вы пробовали со стилем ttk?   -  person Matiiss    schedule 09.04.2021


Ответы (1)


Ну, я создал свой собственный класс 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, x, y):
        self.x = x
        self.y = y
        self.canvas.create_circle(x, y, self.radius, outline=self.fill)
        self.canvas.create_text(x + 2*self.radius, y, 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, 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", variable=r, value=2,
                                fill="white")
            but_2.put(150, 150)

            r.set(1)

            root.mainloop()


obj = GUI_Prog()

Вы создаете его как обычно, но передаете <tkinter.Canvas> как его master. После этого вы можете просто вызвать .put с позицией, в которой вы хотите, чтобы она была создана. Это очень неоднородное решение, поэтому, если кто-то еще опубликует лучшее решение, я удалю его.

person TheLizzard    schedule 09.04.2021