【问题标题】:Is there any way to make tkinter Radiobutton transparent on tkinter canvas?有没有办法让 tkinter 单选按钮在 tkinter 画布上透明?
【发布时间】:2021-04-09 18:41:57
【问题描述】:

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

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

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()

【问题讨论】:

  • 我不确定这是否可能。您是否尝试过使用圆圈在 tkinter.Canvas 中创建自己的单选按钮?
  • 您尝试过 ttk 样式吗?

标签: python tkinter tkinter-canvas


【解决方案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()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 2013-08-26
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多