微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复 Tkinter 中的滑块?

如何解决如何修复 Tkinter 中的滑块?

我一直在尝试为椭圆制作左、右和缩放滑块,但我无法让它们全部同步工作。它们自己工作,但是当我尝试在混音中添加第二个滑块时,它们只是重置了它们的位置和比例。我使用 repl.it 编写代码

这是我的代码

import tkinter 

root = tkinter.Tk()
root.option_add('*Font','Times')

#####   MODEL  ######   
y_intvar = tkinter.Intvar()   #create special tk variable
y_intvar.set(150)             #set initial value
x_intvar = tkinter.Intvar()   
x_intvar.set(150)   
radius_intvar = tkinter.Intvar()
radius_intvar.set(150)          
r = 150                       #fixed value for radius
x = 150                       #fixed value for the x position
######   CONTROLLER   #########

# Event handler for slider
def y_changed(new_intval):
     #read the value of y slider
    y = y_intvar.get()
    # update the view
    canvas.coords(circle_item,x-r,y-r,x+r,y+r)
    
def x_changed(new_intval):
     #read the value of y slider
    x = x_intvar.get()
    # update the view
    canvas.coords(circle_item,y+r)

def radius_changed(new_intval):
    # Get data from model
    # Could do this: r = int(new_intval)
    r = radius_intvar.get()
    # Controller updating the view
    canvas.coords(circle_item,y+r)

#create the slider
Y_slider = tkinter.Scale(root,from_=1,to=300,variable=y_intvar,label='y coordinate',command=y_changed,background='#FF6666')

X_slider = tkinter.Scale(root,variable=x_intvar,label='x coordinate',command=x_changed,background='#FFFF33')

radius_slider = tkinter.Scale(root,variable=radius_intvar,label='Radius         ',command=radius_changed,background='#66FF66')

#place the slider in row1 and column0
Y_slider.grid(row=2,column=0,sticky=tkinter.W)
X_slider.grid(row=3,sticky=tkinter.W)
radius_slider.grid(row=1,sticky=tkinter.W)
#directions for the user
text = tkinter.Label(root,text='Drag slider \n to adjust \n circle.')
text.grid(row=0,column=0)

######   VIEW   ################### present the information to user

#need a canvas to draw the circle on
canvas = tkinter.Canvas(root,width=500,height=500,background='#FFFFFF')
canvas.grid(row=0,rowspan=9,column=1)

# Create a circle on the canvas 
y = y_intvar.get()
x = x_intvar.get()
r = radius_intvar.get()
circle_item = canvas.create_oval(x-r,y+r,outline='#000000',fill='#00FFFF')

root.mainloop()```

解决方法

您没有在 xyr 中将 x_changed()y_changed()radius_changed() 声明为全局:

def x_changed(new_intval):
    global x
    ...

def y_changed(new_intval):
    global y
    ...

def radius_changed(new_intval):
    global r
    ...

其实你可以将三个函数合二为一,不需要将三个变量声明为全局变量:

def on_changed(_):
    x = x_intvar.get()
    y = y_intvar.get()
    r = radius_intvar.get()
    canvas.coords(circle_item,x-r,y-r,x+r,y+r)

#create the slider
Y_slider = tkinter.Scale(root,from_=1,to=300,variable=y_intvar,label='y coordinate',command=on_changed,background='#FF6666')

X_slider = tkinter.Scale(root,variable=x_intvar,label='x coordinate',background='#FFFF33')

radius_slider = tkinter.Scale(root,variable=radius_intvar,label='Radius         ',background='#66FF66')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。