Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何绘制具有可缩放半径的圆?_Python_Matplotlib_Tkinter - Fatal编程技术网

Python 如何绘制具有可缩放半径的圆?

Python 如何绘制具有可缩放半径的圆?,python,matplotlib,tkinter,Python,Matplotlib,Tkinter,我写了几行代码,应该画一个圆,我可以通过使用滑块调整它的半径。不幸的是,我的代码中肯定有一些重大错误,但由于我是初学者,很难找到它们。有谁能给我一些建议使它工作吗 使用tkinter设置了一个小型GUI,包括Tk.Scale和画布。函数drawCircle创建一个Circle艺术家。重要的部分是将滑块与函数changeRadius连接起来,但我不知道该怎么做。请参阅下面我的代码 import sys if sys.version_info[0] < 3: import Tkinte

我写了几行代码,应该画一个圆,我可以通过使用滑块调整它的半径。不幸的是,我的代码中肯定有一些重大错误,但由于我是初学者,很难找到它们。有谁能给我一些建议使它工作吗

使用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()
导入系统 如果系统版本信息[0]<3: 将Tkinter作为Tk导入 其他: 将tkinter作为Tk导入 从matplotlib.figure导入图形 从matplotlib导入pyplot作为plt 从matplotlib.backends.backend_tkagg导入图CAVASTKAGG 类PlotCircle(): 定义初始(自我,主): self.master=master 主人象似性 self.f_rad=2#初始值 self.frame=Tk.frame(主) self.frame.pack(side=Tk.TOP,fill=Tk.BOTH,expand=0) self.radius_label=Tk.label(self.frame,text='radius:') 自半径标签包装(侧面=左侧) self.scroll_radius=Tk.Scale(self.frame,从_=1.0到=3.0,分辨率=0.05, 方向=Tk.HORIZONTAL,命令=lambda:self.changeRadius(self.circle)) 自滚动半径设置(2.0) 自滚动半径包(侧=左侧) self.image\u frame=Tk.frame(主) self.image\u frame.pack(side=Tk.TOP,fill=Tk.BOTH,expand=1) self.fig=图() self.ax=self.fig.add_子批次(111) self.ax.set_aspect('equal')) self.canvas=FigureCanvasTkAgg(self.fig,self.image\u框架) self.canvas.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=1) self.canvas.\u tkcanvas.pack(side=Tk.TOP,fill=Tk.BOTH,expand=1) def drawCircle(自): self.circle=plt.circle((0.5,0.5),self.f_rad*0.1,color='#F97306',fill=False) self.ax.add_艺术家(self.circle) self.fig.canvas.draw() def changeRadius(自身、循环): self.f_rad=float(self.scroll_radius.get()) 打印(self.f_rad) 循环设定半径(自f半径) self.fig.canvas.draw() root=Tk.Tk() 绘图圆(根) root.mainloop() 通过执行此代码,我得到以下错误:

Tkinter回调中的异常 回溯(最近一次呼叫最后一次): 文件“C:\Users\p.schulmeyer\AppData\Local\Continuum\anaconda3\lib\tkinter\uuuu init\uuuuuu.py”,第1705行,在调用中 返回self.func(*args) TypeError:lambda()接受0个位置参数,但给出了1个


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

您需要执行以下更改以使脚本正常工作

  • 确保在构造函数中调用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()
    

这里真的不需要
lambda
command=self.changeRadius
做同样的事情。