Невозможно правильно привязать слайдер tkinter к функциям - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь сделать наивный городской генератор. Я был успешным в создании блоков указанной высоты.

Кроме того, я смог написать скрипт, который изменяет высоту блока с помощью ползунка.

Задача

  1. I Я не могу делать обе вещи вместе. (Я думаю, что я могу решить эту проблему, потому что ошибка касается только ссылки перед назначением)
  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()

Извините за «не очень описательное форматирование» вопроса ( с удовольствием предоставлю более подробную информацию в комментариях ). Это беспокоит меня некоторое время, и я просто разочарован.

1 Ответ

1 голос
/ 16 марта 2020

Проблема в том, что heights в wid является локальной переменной. Вы изменяете значение внутри функции, но глобальная переменная остается неизменной.

Вам либо нужно объявить 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").

...