Как построить окружность с масштабируемым радиусом?

#python #matplotlib #tkinter

#python #matplotlib #tkinter

Вопрос:

Я написал несколько строк кода, которые должны нарисовать окружность, радиус которой я могу регулировать с помощью ползунка. К сожалению, в моем коде должно быть несколько серьезных ошибок, но поскольку я новичок, их трудно найти. Кто-нибудь может дать мне совет, как заставить это работать?

С помощью tkinter был настроен крошечный графический интерфейс, включающий Tk.Scale и холст. Функция drawCircle создает Circle исполнителя. Существенной частью является соединение ползунка с функцией changeRadius , но вот тут я не знаю, что делать. Смотрите мой код ниже…

 import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk
from matplotlib.figure import Figure
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class PlotCircle():

    def __init__(self, master):
        self.master = master
        master.iconify

        self.f_rad = 2  # initial value

        self.frame = Tk.Frame(master)
        self.frame.pack(side=Tk.TOP, fill=Tk.BOTH, expand=0)
        self.radius_label = Tk.Label(self.frame, text='Radius: ')
        self.radius_label.pack(side=Tk.LEFT)
        self.scroll_radius = Tk.Scale(self.frame, from_=1.0, to=3.0, resolution=0.05,
                                      orient=Tk.HORIZONTAL, command=lambda:self.changeRadius(self.circle))
        self.scroll_radius.set(2.0)
        self.scroll_radius.pack(side=Tk.LEFT)
        self.image_frame = Tk.Frame(master)
        self.image_frame.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        self.ax.set_aspect('equal')
        self.canvas = FigureCanvasTkAgg(self.fig, self.image_frame)
        self.canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
        self.canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)     

    def drawCircle(self):
        self.circle = plt.Circle((0.5, 0.5), self.f_rad*0.1, color='#F97306', fill=False)
        self.ax.add_artist(self.circle)
        self.fig.canvas.draw()

    def changeRadius(self, circ):
        self.f_rad = float(self.scroll_radius.get())
        print(self.f_rad)
        circ.set_radius(self.f_rad)
        self.fig.canvas.draw()

root = Tk.Tk()
PlotCircle(root)
root.mainloop()
  

Выполняя этот код, я получаю следующую ошибку:

Исключение в трассировке обратного вызова Tkinter (последний последний вызов): Файл «C:Usersp.schulmeyerAppDataLocalContinuumanaconda3libtkinter__init__.py «, строка 1705, в вызове return self.func(*аргументы) Ошибка типа: lambda() принимает 0 позиционных аргументов, но был задан 1

Я также пытался использовать lambda e: или вообще не использовать lambda, но ничего не помогло. Я предполагаю, что моя ошибка, должно быть, в чем-то более фундаментальном. Я действительно ценю любую помощь. Спасибо!

Ответ №1:

Вам нужно внести следующие изменения, чтобы ваш скрипт заработал.

  • Убедитесь, что вы вызываете drawCircle в конструкторе, следовательно, установлен self.circle
  • команде нужна функция, которая может принимать параметр

     def __init__(self, master):
        ...
        self.scroll_radius = Tk.Scale(self.frame, from_=1.0, to=3.0, resolution=0.05,
                                      orient=Tk.HORIZONTAL, command=lambda x:self.changeRadius(x))
    
        ...
        self.drawCircle()  
    
    def changeRadius(self, new_radius):
        self.circle.set_radius(float(new_radius)*0.1)
        self.fig.canvas.draw()
      

Комментарии:

1. lambda Здесь действительно нет необходимости, command=self.changeRadius делает то же самое.