简体   繁体   中英

How do I fix the sliders in Tkinter?

I've been trying to make a left, right, and scale slider for an oval but I can't get them all to work in sync. They work on their own but when I try to add a second slider to the mix, they just reset their position and scale. I used repl.it to write the code.

Here's my code:

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, x-r, y-r, x+r, 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, 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=y_changed, background='#FF6666')

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

radius_slider = tkinter.Scale(root, from_=1, to=300, 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, column=0, sticky=tkinter.W)
radius_slider.grid(row=1, column=0, 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, x+r, y+r,outline='#000000', fill='#00FFFF')

root.mainloop()```

You missed to declare x , y and r as global inside x_changed() , y_changed() and radius_changed() :

def x_changed(new_intval):
    global x
    ...

def y_changed(new_intval):
    global y
    ...

def radius_changed(new_intval):
    global r
    ...

Actually you can combine the three functions into one and don't need to declare the three variables as global:

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, from_=1, to=300, variable=x_intvar, label='x coordinate', command=on_changed, background='#FFFF33')

radius_slider = tkinter.Scale(root, from_=1, to=300, variable=radius_intvar,label='Radius         ', command=on_changed, background='#66FF66')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM