मैं tkinter के लिए बिल्कुल नया हूं और मैंने हाल ही में कैनवास विजेट के बारे में सीखा है। बुनियादी बातों को समझने के बाद मैंने सोचा कि मैं एक कस्टम प्रगति पट्टी बनाने के लिए कैनवास का उपयोग कर सकता हूं और यह काम कर गया! यह वास्तव में बहुत बढ़िया है, हालांकि, आकृतियों पर रूपरेखा को हटाने के बाद मैंने देखा कि आकृतियों के किनारे विशेष रूप से अंडाकार थे। मैंने थोड़ी खोज की और पाया कि आप चिकना कीवर्ड तर्क का उपयोग केवल पॉलीगॉन के साथ कर सकते हैं। तो मेरा सवाल यह है कि क्या टिंकर में विशेष रूप से अंडाकार आकृतियों के किनारों को चिकना करने का कोई तरीका है, जैसे एंटी-अलियासिंग? मेरा कोड:

from tkinter import *

root = Tk()
root.geometry("500x500")
percent = 0
progress_done, new_oval = None, None
canvas = Canvas(root, width=400, height=400, bg="white")
canvas.pack(pady=10)
prg_bar = canvas.create_rectangle(50, 140, 350, 160, fill="grey", outline="")
oval_one = canvas.create_oval(40, 140, 60, 160, fill="grey", outline="", )
oval_two = canvas.create_oval(340, 140, 360, 160, fill="grey", outline="")


def add_up():
    global percent, progress_done, new_oval
    if percent < 100:
        percent += 20
        if progress_done is None and new_oval is None:
            canvas.create_oval(40, 140, 60, 160, fill="light blue", outline='')
            canvas.delete(oval_one)
            progress_done = canvas.create_rectangle(50, 140, (percent * 3) + 50, 160, fill="light blue", outline="")
            new_oval = canvas.create_oval((percent * 3) + 40, 140, (percent * 3) + 60, 160, fill="light blue",
                                          outline="")
        else:
            canvas.delete(progress_done)
            canvas.delete(new_oval)
            progress_done = canvas.create_rectangle(50, 140, (percent * 3) + 50, 160, fill="light blue", outline="")
            new_oval = canvas.create_oval((percent * 3) + 40, 140, (percent * 3) + 60, 160, fill="light blue",
                                          outline="")
            if percent == 100:
                canvas.delete(oval_two)


btn = Button(root, text="Add to prg", command=add_up)
btn.pack()
root.mainloop()
0
Omid Ketabollahi 10 नवम्बर 2020, 14:54

1 उत्तर

सबसे बढ़िया उत्तर

create_polygon से अपना अंडाकार ड्रा करें। नीचे एक अंडाकार और एक गोल आयत बनाने का एक उदाहरण दिया गया है। दोनों उदाहरण उत्पन्न वक्रों की चिकनाई को बढ़ाने के लिए splinesteps विकल्प सेट करते हैं। splinesteps विकल्प डिफ़ॉल्ट रूप से 12 हो जाता है।

import tkinter as tk
root = tk.Tk()

c = tk.Canvas(root)
c.pack(fill='both', expand=True, anchor='nw')

def poly_oval(x, y, width, height, resolution=32):
    points = [x, y,
              x+width, y,
              x+width, y+height,
              x, y+height,
              x, y]
              
    return c.create_polygon(points, fill='#f00', smooth=True, splinesteps=resolution)   
    
def poly_roundrect(x, y, width, height, radius, resolution=32):
    #this is not a true round rect
    #it's a round rect with the potential to have invisible garbage that cheats
    #it cheats convincingly if you don't use an outline when it is cheating
    radius = min(min(width, height), radius*2)
    points = [x, y,
              x+radius, y,
              x+(width-radius), y,
              x+width, y,
              x+width, y+radius,
              x+width, y+(height-radius),
              x+width, y+height,
              x+(width-radius), y+height,
              x+radius, y+height,
              x, y+height,
              x, y+(height-radius),
              x, y+radius,
              x, y]
              
    rect = c.create_polygon(points, fill='#1f1', smooth=True, splinesteps=resolution) 
    
    #display vertices
    #for i in range(0, len(points), 2):
    #    poly_oval(points[i]-2, points[i+1]-2, 4, 4)
              
    return rect
    
rect = poly_roundrect(10, 10, 300, 50, 10, 64)

root.mainloop()
1
Michael Guidry 10 नवम्बर 2020, 17:57