【问题标题】:How to plot circle with scalable radius?如何绘制具有可缩放半径的圆?
【发布时间】:2019-08-20 06:31:02
【问题描述】:

我写了几行代码来绘制一个圆,我可以在其中使用滑块调整其半径。不幸的是,我的代码中一定有一些重大错误,但由于我是初学者,很难找到它们。谁能给我一些建议以使其正常工作?

使用 tkinter 设置了一个小型 GUI,包括一个 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:\Users\p.schulmeyer\AppData\Local\Continuum\anaconda3\lib\tkinter__init__.py”,第 1705 行,调用中 返回 self.func(*args) TypeError: lambda() 接受 0 个位置参数,但给出了 1 个

我也尝试使用lambda e: 或根本不使用 lambda,但没有任何帮助。我想我的错误一定是更根本的。我真的很感激任何帮助。谢谢!

【问题讨论】:

    标签: python matplotlib tkinter


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

    【讨论】:

    • 这里真的不需要lambdacommand=self.changeRadius 做同样的事情。
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多