2015-06-19 3 views
3

Я пытаюсь разработать графический интерфейс в Tkinter. У меня есть основной кодПоказать значение масштаба в холсте в Tkinter

from menus import * 
from Tkinter import * 
from SpeedControl import * 

Main = Tk() 
Main.tk_setPalette(background='white') 
GenerateMenus(Main) 
GenerateSlider(Main) 
mainloop() 

Код для GenerateSlider является от Tkinter импорта *

def GenerateSlider(master): 
    display1 = Canvas(master, width=150, height=80, relief=RAISED, bd=5) 
    display1.grid(row=0,column=0) 
    display1.create_rectangle(10, 10, 150, 80, fill='dark red') 
    slider1 = Scale(master, from_=0, to=100, length=400, 
        tickinterval=10, orient=HORIZONTAL, relief=SUNKEN, bd=5, 
        bg='white', troughcolor='black', sliderrelief=RAISED) 
    slider1.grid(row=0,column=1) 
    display1.create_text(50,20, font='Helvatica 28', text=slider1.get(), fill='white', anchor=NW) 
    display2 = Canvas(master, width=150, height=80, relief=RAISED, bd=5) 
    display2.grid(row=1,column=0) 
    display2.create_rectangle(10, 10, 150, 80, fill='dark red') 
    slider2 = Scale(master, from_=0, to=100, length=400, 
        tickinterval=10, orient=HORIZONTAL, relief=SUNKEN, bd=5, 
        bg='white', troughcolor='black', sliderrelief=RAISED) 
    slider2.grid(row=1,column=1) 
    display2.create_text(50,20, font='Helvatica 24', text=slider2.get(), fill='white', anchor=NW) 

То, что я пытаюсь сделать здесь является то, что программа должна отображать текущее значение ползунка в виде текста внутри холста. Начальное значение отображается на холсте, но мне нужен метод для обновления значения при перемещении ползунка.

+0

Можете ли вы создать функцию обратного вызова при перемещении шкалы (команда = someFunction при создании виджета Scale) и внутри обратного вызова display1.update()? (Или какой бы дисплей не обновлялся) – maccartm

ответ

1

Позвольте мне подробнее остановиться на моем комментарии. Это то, что я имею в виду (используя классы и упрощенный пример, чтобы удовлетворить мою цель):

from Tkinter import * 

class Window(): 

    def __init__(self, master): 

     self.display1 = Canvas(master, width=150, height=80, relief=RAISED, bd=5) 
     self.display1.grid(row=0,column=0) 
     self.display1.create_rectangle(10, 10, 150, 80, fill='dark red') 

     self.slider1 = Scale(master, from_=0, to=100, length=400, 
       tickinterval=10, orient=HORIZONTAL, relief=SUNKEN, bd=5, 
       bg='white', troughcolor='black', sliderrelief=RAISED, command = self.updateCanvas) 
     self.slider1.grid(row=0,column=1) 

     self.createdText = self.display1.create_text(50, 20, font = 'Helvatica 28', text = self.slider1.get(), fill = 'white', anchor = NW) 

    def updateCanvas(self, sliderVal): 

     self.display1.itemconfig(self.createdText, text = sliderVal) 

master = Tk() 
w = Window(master) 
master.mainloop() 

Edit: Удалена лямбда от вызова к updateCanvas как command для шкалы виджетов передает это значение при вызове. Я смог вместо этого дать updateCanvas параметр sliderVal, который автоматически передается, а затем я использую это для обновления текста. Также был удален звонок до update(), поскольку это было необязательно.

Edit 2: Обновленный код, чтобы отразить предложение по fhdrsdg, что позволяет текст, который будет обновляться без необходимости уничтожить & воссоздать это каждый раз, когда функция обновления называется.

+1

Вы можете создать текст один раз, используя 'self.createdText = self.display1.create_text (50,20, font = 'Helvatica 28', text = self.slider1.get(), fill = 'white', anchor = NW) 'сразу после создания слайдера, а затем обновить текст в' updateCanvas', используя 'self.display1.itemconfig (self.createdText, text = sliderVal)'. Таким образом, вы не удаляете и не создаете текстовый виджет Canvas при каждом изменении слайдера, вы просто обновляете отображаемый текст. – fhdrsdg

+0

Будет обновлено на основе этого предложения. Я создал этот пример на основе моих профессиональных знаний о других виджетах, впервые играя с виджетами Canvas! – maccartm

+0

Этот код работал. Спасибо за помощь. На самом деле, это мой первый проект Tkinter. –

Смежные вопросы