簡體   English   中英

無法將 tkinter 滑塊正確綁定到功能

[英]Unable to bind tkinter slider properly to functions

我正在嘗試制作一個天真的城市生成器。 我已經成功地制作了指定高度的積木。

此外,我已經能夠編寫一個使用滑塊更改塊高度的腳本。

問題

  1. 我不能同時做這兩件事。 (我想我可以解決這個問題,因為錯誤僅與分配前的引用有關)
  2. 使用水平滑塊,我想增加建築物的數量(可視化為通過減小寬度來增加 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() ,對blocks

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

您還遇到了在創建新畫布之前沒有刪除舊畫布項目的問題。 您的draw功能需要銷毀舊元素。 你可以用canvas.delete("all")做到這canvas.delete("all")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM