2014-09-28 4 views
0

Я играю с виджетами Tkinter и пытаюсь применить полосу прокрутки к виджету холста, но когда программа запускается, она зависает - нет сообщения об ошибке и т. Д.Проблемы с применением полосы прокрутки к виджету холста в Tkinter

Во-первых, это общая логика, чтобы прикрепить полосу прокрутки в порядке?

Во-вторых, проблема связана с методом .pack(), так как удаление этого позволяет запустить программу. Как я использовал метод .grid() else, где это означает, что я должен использовать метод .grid() для прокрутки? Если да, то как это можно достичь? Любая помощь для получения этой работы будет чрезвычайно оценена. Заранее благодарю за ваше время.

from tkinter import * 

x = 10 
y = 10 
a = 100 
b = 100 

def change_coord(event): 
     global coord 
     if event.keysym == 'Up': 
      coord[1] -=1 
      coord[3] -=3 
     if event.keysym == 'Down': 
      coord[1] +=1 
      coord[3] +=3 
     if event.keysym == 'Right': 
      coord[0] +=1 
      coord[2] +=3 
     if event.keysym == 'Left': 
      coord[0] -=1 
      coord[2] -=3 
     canvas1.coords(arc, *coord) 


window = Tk() 
window.geometry("500x500") 


#canvas scroll bar 
scrollbar = Scrollbar(window) 
scrollbar.pack(side=RIGHT, fill=Y) 

#canvas and drawing 
canvas1=Canvas(window, yscrollcommand=scrollbar.set, height = 200, width = 400) 
canvas1.grid(row=0, column=0, sticky=W) 
coord = [x, y, a, b] 
arc = canvas1.create_rectangle(*coord, outline="#fb0", fill="#fb0") 

#canvas scrollbar continued 
scrollbar.config(command=canvas1.yview) 

#captureing keyboard inputs and assigning to function 
window.bind_all('<Up>', change_coord) 
window.bind_all('<Down>', change_coord) 
window.bind_all('<Left>', change_coord) 
window.bind_all('<Right>', change_coord) 
window.mainloop() 

Кроме того, я вижу, что, когда я использую метод .pack() поместить холст в окне работает программа, полоса прокрутки видима, но полоса прокрутки не на самом деле работает. Любая помощь с этой проблемой будет очень приветствоваться. Спасибо.

+0

Почему _are_ вы используете 'grid' вместо' pack' для 'canvas1'? – abarnert

+0

Этот код взят из более крупного раздела кода, где все добавленные виджеты были организованы с использованием метода сетки. – sw123456

+0

Из http://effbot.org/tkinterbook/grid.htm: Предупреждение: никогда не смешивайте сетку и пакет в том же главном окне. Кстати, для меня это работает несколько (с 'пакетом' для холста). У меня есть полоса прокрутки и вы можете переместить окно, щелкнув вверх/вниз. Однако бар сам заполняет все вертикальное пространство. – Jasper

ответ

2

Проблема в том, что вы смешиваете pack и grid с двумя виджетами, которые имеют один и тот же родительский элемент. Вы не можете этого сделать. Вы должны всегда использовать один или другой для всех виджетов, которые имеют один и тот же родитель.

Как только вы решите эту проблему, другая проблема заключается в том, что вы не определяете, какая часть холста должна быть видимой. Вам нужно настроить scrollregion на холсте. Чаще всего вам просто нужно установить область прокрутки, чтобы охватить все на холсте. Чтобы получить ограничительную рамку все на холсте вы можете использовать метод bbox со специальным "all" тегом:

canvas1.configure(scrollregion=canvas1.bbox("all")) 

Если вы хотите, чтобы прокручивать область, чтобы быть больше, чем то, что было нарисовано, указать любой размер вы хотите, как кортеж. Вы просто указываете координаты, которые хотите видеть. Например:

canvas1.configure(scrollregion=(0,0,10000,10000) 
+0

Это отличный Брайан, спасибо. Я добавил код, который вы предложили, единственная проблема заключается в том, что прокрутка становится работоспособной только тогда, когда окно сворачивается до меньшего размера, чем чертеж прямоугольника. Даже перемещение прямоугольника вниз за пределы окна не приводит к тому, что свиток становится функциональным. Что я делаю не так? Еще раз спасибо за ваше время. – sw123456

+0

@ sw123456: вы ничего не делаете неправильно. Это ожидаемое поведение. Если вы хотите, чтобы полосы прокрутки контролировали большую область, расскажите, в каком регионе вы хотите прокручивать. Например, если вы хотите, чтобы область с прокруткой составляла 10 000 пикселей, выполните 'canvas1.configure (scrollregion = (0,0,10000,10000))' –

+0

Кроме того, если бы у меня было больше виджетов в окне, и поскольку я не могу использовать метод .grid(), чтобы упорядочить их, если я хочу иметь прокручиваемый холст, что лучший способ организовать эти другие виджеты, поскольку метод .pack() не кажется таким простым в организации виджетов? Благодарю. – sw123456

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