Найти - Пользователи
Полная версия: Tkinter: проблема со Scrollbar
Начало » GUI » Tkinter: проблема со Scrollbar
1 2
vanvanov
Пишу программу, в которой есть много полей типа Entry, около них стоят чекбоксы. Не могу заставить работать скроллбар - он просто не смещает экран вниз. Кроме того, на выходе получается вот такая странная лесенка. Как исправить?
#!/usr/bin/python3
from tkinter import *
def show_list(long_list):
	top=Toplevel()
	listbox=Listbox(top)
	listbox.pack()
	scrollbar=Scrollbar(listbox,jump=0)
	scrollbar.pack(side=RIGHT,fill=Y)
	entries=[]
	cb=[]
	for i, text in enumerate(long_list):
		entries.append(Entry(listbox,text=text,width=80))
		cb.append(Checkbutton(listbox))
		entries[i].insert(1,text)
		entries[i].pack()
		cb[i].pack(side=RIGHT)
	listbox.config(yscrollcommand=scrollbar.set)
	scrollbar.config(command=listbox.yview)
root=Tk()
long_list=[]
i=0
for i in range(100):
	long_list.append(i+1)
show_list(long_list)
root.mainloop()
4kpt_II
Вы немножко неверно делаете. Давайте по-этапам:
1. Для упаковки виджетов в виде таблиц рационально использовать метод .grid()
2. Не нужно паковать эти виджеты в Listbox. Это ничего не даст, а только запутает.
3. Для того, чтобы эти виджеты прокручивались желательно упаковать их всех в рамочку. А рамочку разместить на канвасе и уже там все это скроллить с использованием метода .create_window().
4. Замените строки

long_list=[]
i=0
for i in range(100):
	long_list.append(i+1)

На

long_list = [i+1 for i in xrange(100)]

5. Так делать нельзя. Я Вам уже про это писал.

from tkinter import *

Почитать можно Тут.


Будут вопросы - пишите.
vanvanov
4kpt_II
Вы немножко неверно делаете. Давайте по-этапам:1. Для упаковки виджетов в виде таблиц рационально использовать метод .grid()2. Не нужно паковать эти виджеты в Listbox. Это ничего не даст, а только запутает.3. Для того, чтобы эти виджеты прокручивались желательно упаковать их всех в рамочку. А рамочку разместить на канвасе и уже там все это скроллить с использованием метода .create_window().4. Замените строки
Спасибо за подробный ответ! Я сделал так:
#!/usr/bin/python3
import tkinter as tk
def show_list(long_list):
	top=tk.Toplevel()
	canvas=tk.Canvas(top)
	frame=tk.Frame(canvas)
	frame.grid()
	canvas.grid()
	canvas.create_window(0,0,window=frame,anchor=tk.N+tk.W)
	scrollbar=tk.Scrollbar(top,command=canvas.yview,orient=tk.VERTICAL)
	scrollbar.grid(row=0,column=1,sticky='ns')
	entries=[]
	cb=[]
	for i, text in enumerate(long_list):
		entries.append(tk.Entry(frame,text=text,width=80))
		cb.append(tk.Checkbutton(frame))
		entries[i].insert(1,text)
		entries[i].grid(row=i, column=0, sticky='w')
		cb[i].grid()
	canvas.config(yscrollcommand=scrollbar.set)
	scrollbar.config(command=canvas.yview)
root=tk.Tk()
long_list = [i+1 for i in range(100)]
show_list(long_list)
root.mainloop()
Но scrollbar не изменяет размеры, а чекбоксы не отображаются.
4kpt_II
Держите код. Только здесь без прокручивания…

import Tkinter
def show_list(long_list, root):
    root.geometry("400x400+100+100")
    root.focus_force()
    frm = Tkinter.Frame(root)
    frm.pack(side="left")
    scrollbar = Tkinter.Scrollbar(root)
    scrollbar.pack(side="left",fill="y")
    entries = []
    cb = []
    for i, text in enumerate(long_list):
        entries.append(Tkinter.Entry(frm, text=text, width=20))
        cb.append(Tkinter.Checkbutton(frm))
        entries[i].insert(1,text)
        entries[i].grid(row=i, column=0)
        cb[i].grid(row=i, column=1)
    #frm.config(yscrollcommand=scrollbar.set)
    #scrollbar.config(command=frm.yview)
root = Tkinter.Tk()
long_list = [i+1 for i in xrange(100)]
show_list(long_list, root)
root.mainloop()

Прокручивание попробуйте реализовать самостоятельно для самообучения…
Не получится - напишите.

P.S. Еще раз увижу from tkinter import * - больше помогать не буду
dimy44
4kpt_II
P.S. Еще раз увижу from tkinter import * - больше помогать не буду
к сожалению, 99% примеров в сети почему-то именно такие, и новички будут руководствоваться
4kpt_II
Тут вопрос в другом. Я уже vanvanov неоднократно об этом писал. В предпоследнем посте даже дал ссылку, где подробно рассписано, почему так делать нельзя. Он игнорирует. Я просто именно его предупредил.

P.S. Я же читаю его не самый лучший код и мне не лень. Если ему лень подправить свой код, чтобы он был правильнее заранее хотя-бы в этой мелочи, то мне будет лень его читать в следущий раз Я думаю это справедливо.
dimy44
Кстати вот лично мое мнение- введение в питон разработчиками возможности такой конструкции- чудовищная ошибка. Наряду с известными опасностями зачастую ещё и код читать тяжелее (я не про ткинтер, а вообще)
vanvanov
4kpt_II
import Tkinter def show_list(long_list, root): root.geometry(“400x400+100+100”) root.focus_force()
Спасибо. Я уже начал подходить к мысли, что нужно прямо указать геометрию
Кстати, а что дает root.focus_force()? В других моих программах окно упорно не хочет брать фокус, выходит на первый план, но все равно неактивно, хоть на нем .focus_set() или .focus_force().
4kpt_II
Делает окно или виджет активным. Если сделать виджет, то и окно, на котором будет рассположен виджет станет активным.
vanvanov
А это всегда работает? Мне, сколько я не бился, не удалось добиться, чтобы вновь создаваемые окна всегда были активными. Иногда бывает, что окна, созданные одной и той же процедурой, иногда бывают активными, иногда - пассивными. Грешу на DE, потому что в некоторых средах, насколько я пробовал, такое не повторяется (Gnome 2).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB