Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 无法将tkinter滑块正确绑定到函数_Python_User Interface_Tkinter_Tkinter Canvas - Fatal编程技术网

Python 无法将tkinter滑块正确绑定到函数

Python 无法将tkinter滑块正确绑定到函数,python,user-interface,tkinter,tkinter-canvas,Python,User Interface,Tkinter,Tkinter Canvas,我想做一个天真的城市发电机。我已经成功地制作了指定高度的积木 此外,我还能够编写一个脚本,使用滑块更改块的高度 问题 我不能同时做这两件事。(我想我可以解决这个问题,因为错误只与赋值前的引用有关) 使用水平滑块,我希望增加建筑物的数量(通过减小宽度来增加x轴上的条数)。但这段代码根本不起作用,我的意思是,它甚至没有引起错误 到目前为止的代码 from tkinter import * import random bars = 5 margin = 30 heights= [5, 2, 1, 8

我想做一个天真的城市发电机。我已经成功地制作了指定高度的积木

此外,我还能够编写一个脚本,使用滑块更改块的高度

问题

  • 我不能同时做这两件事。(我想我可以解决这个问题,因为错误只与赋值前的引用有关)
  • 使用水平滑块,我希望增加建筑物的数量(通过减小宽度来增加x轴上的条数)。但这段代码根本不起作用,我的意思是,它甚至没有引起错误
  • 到目前为止的代码

    from tkinter import *
    import random
    
    bars = 5
    margin = 30
    heights= [5, 2, 1, 8, 4]
    blocks = []
    length = 600
    breadth = 360
    
    def draw():
        aligner = margin
        width = (breadth - margin*2)/bars
        for height in heights :
            block = {"height" : height }
            block['rect'] = canvas.create_rectangle(aligner,550-50*height,aligner+width,550, fill="green")
            block['color'] = 'green'
            blocks.append(block)
            aligner += width
        root.update()
    
    
    def wid(e):
        bars = int(e)
        blocks = []
        heights = []
        for i in range(bars):
            h = random.random()*10
            heights.append(h)
        draw()
    
    def h_rand(e):
        factor = e
        heights = [i * factor for i in heights]
        draw()
    
    root = Tk()
    
    
    width = 60
    aligner = 30
    
    slider_y = Scale(root, from_=1 , to=8, bg="blue",command = h_rand)
    slider_y.pack(side=LEFT)
    
    canvas = Canvas(root,height=length,width=breadth)
    canvas.pack()
    
    for height in heights :
        block = {"height" : height }
        block['rect'] = canvas.create_rectangle(aligner,550-50*height,aligner+width,550, fill="green")
        block['color'] = 'green'
        blocks.append(block)
        aligner += width
    
    
    slider_x = Scale(root, from_=50 , to=200, orient = HORIZONTAL, bg="blue",command = wid)
    slider_x.pack(side=TOP)
    
    root.mainloop()
    

    我很抱歉这个问题的“描述格式不太好”(很高兴在评论中提供更多细节)。它现在困扰了我一段时间,我只是感到沮丧。

    问题是
    wid中的
    heights
    是一个局部变量。您正在更改函数内的值,但全局变量保持不变

    您需要在函数中将
    heights
    声明为全局变量,或者使用全局变量而不使用新列表替换它

    要将其清除为全局,请在要修改的函数顶部添加
    global heights

    def wid(e):
        global heights, blocks
        ...
    
    您可以使用列表的
    clear
    方法删除内容,而无需重置变量本身。为此,请将
    heights=[]
    替换为
    heights.clear()
    ,并将
    块替换为

    def wid(e):
        bars = int(e)
        print("bars:", bars)
        blocks.clear()
        heights.clear()
        ...
    


    您还存在一个问题,即在创建新画布之前没有删除旧画布项。您的
    draw
    函数需要销毁旧元素。您可以使用
    canvas.delete(“全部”)
    来实现这一点

    嗯,您设置了一个变量
    width
    和一个名为
    width
    @jizhaosama的函数,我认为这不会引起任何错误,因为命令总是将函数作为属性而不是变量。无论如何,我确实改变了它,但是,仍然没有运气!由于我真的不知道您想做什么,您可以将
    draw()
    函数更改为
    draw(bars)
    ,并将
    draw()
    更改为
    draw(bars)
    函数中的
    wid(e)
    。当你拖动滑块时,它会发生一些变化。@jizhaosama它已经开始缩小以前的条,但没有添加新条,但感谢你在前面帮助我。请告诉我你是否有解决方案well@jizhihaoSAMA(我知道写这篇文章很糟糕,但这篇文章是发自内心的)Thanx bro,你帮了我很多。我在使用全局变量实现这篇文章时遇到了问题,现在我知道了原因。通过将整个代码重新格式化为类并将属性作为该类的特定实例引用,解决了这个问题。(这种方式现在是多态性问题)。我还发现了canvas.delete()的错误。还是谢谢!。。。。。。。当我解决了我发布的问题后,我没有做什么的经验,你能指导我吗?