0 python tkinter matplotlib python-2.7
我正在使用 Tkinter 和 matplotlib 创建一个小的排序数组项目。我的 Tkinter GUI 有一个列表框,我想用它来选择所需的排序算法。我正在使用 matplotlib 的 FuncAnimation() 重复遍历我选择的排序函数并为它们设置动画。FuncAnimation() 使用您决定用作参数的函数的名称。我想为参数分配一个变量,我可以将其重新分配给我想使用的任何函数的名称。
我相信问题在于 listbox.get(ANCHOR) 给了我一个字符串,而 FuncAnimation 想要某种函数对象。我已经研究了将字符串转换为函数对象或可调用函数的可能方法,但我要么不理解,要么找不到任何东西。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from Tkinter import *
import Tkinter as tk
#example of one of the sorting functions.
def Quick_Sort(i):
global arr # I don't know why I have to use a globalized variable. Wouldn't let me pass it arr
n=len(arr)
less_than=[]
equal_to=[]
greater_than=[]
if i in range(1,n-1):
if arr[i-1]>arr[i] or arr[i]>arr[i+1]:
#break into sub arrays
pivot=arr[i]
del arr[i]
for y in range(0,n-1):
plt.clf()
if arr[y]< pivot:
less_than.append(arr[y])
if arr[y]==pivot:
equal_to.append(arr[y])
elif arr[y]>pivot:
greater_than.append(arr[y])
del arr[:]
less_than.append(pivot)
arr=less_than + equal_to + greater_than
del less_than[:], greater_than[:], equal_to[:]
plt.bar(arr_ind,arr)
fig.canvas.draw()
elif i>n-1:
print("'i' is out of range. Exiting program.")
print ("Final array is ", arr)
sys.exit()
return i
def choose_and_run():
choice=listbox.get(ANCHOR)
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
fill_array(arr,arr_ind,arr_size)
fig.canvas.draw()
anim=animation.FuncAnimation(fig,choice,interval=50)
plt.show()
#---TKINTER STUFF-------
window=tk.Tk()
window.title("Sorting Arrays")
window.geometry("150x00")
listbox=tk.Listbox(window)
# Algorithm Options
listbox.insert(1,"Bubble_Sort")
listbox.insert(2,"Insertion_Sort")
listbox.insert(3,"Quick_Sort")
listbox.insert(4,"Selection_Sort")
listbox.pack()
# Select and run button
button1=tk.Button(window,text="Get and Go",command=choose_and_run).pack()
window.mainloop()
Run Code Online (Sandbox Code Playgroud)
希望这是足够的信息。任何帮助表示赞赏。
您通常不会将字符串直接转换为函数名称,即使使用 Python 几乎可以实现任何功能。但是,函数只是对象,所以只需使用字典:
chosenfunc = {"Bubble_Sort":Bubble_Sort, "Insertion_Sort":Insertion_Sort,
"Quick_Sort":Quick_Sort, "Selection_Sort":Selection_Sort}
selection=listbox.get(ANCHOR)
choice = chosenfunc[selection]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |