python - 如何修复 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, 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()```
解决方案
您错过了声明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
...
实际上,您可以将三个函数合二为一,而无需将三个变量声明为全局变量:
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')
推荐阅读
- java - 如何将包含值的自定义详细信息存储在 mysql 表的新列中?
- vue.js - this.$refs, this.$router, this.$route 使用 Vue 2 组合 API 访问
- crystal-reports - 如何在 Crystal Reports 中显示 mysql 自定义列
- domain-driven-design - DDD 聚合由多个表中的记录组成,但对于业务来说并不重要
- node.js - 无法访问 Zomato 开发者页面
- flutter - 我正在使用颤振的 in_app_purchase 实施计费,但我收到了家庭共享请求
- c# - 反序列化嵌套在自身中的 XML 节点
- sql-server - 仅从字符串的开头替换非字母字符
- grpc - Quarkus 阻塞 grpc vert.x 事件循环错误
- sql - 根据其他列格式化代理键