Форум сайта python.su
Пишу программу, в которой есть много полей типа 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()
Офлайн
Вы немножко неверно делаете. Давайте по-этапам:
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)]
from tkinter import *
Отредактировано 4kpt_II (Дек. 23, 2013 03:19:33)
Офлайн
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()
Офлайн
Держите код. Только здесь без прокручивания…
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()
Отредактировано 4kpt_II (Дек. 23, 2013 20:10:51)
Офлайн
4kpt_IIк сожалению, 99% примеров в сети почему-то именно такие, и новички будут руководствоваться
P.S. Еще раз увижу from tkinter import * - больше помогать не буду
Офлайн
Тут вопрос в другом. Я уже vanvanov неоднократно об этом писал. В предпоследнем посте даже дал ссылку, где подробно рассписано, почему так делать нельзя. Он игнорирует. Я просто именно его предупредил.
P.S. Я же читаю его не самый лучший код и мне не лень. Если ему лень подправить свой код, чтобы он был правильнее заранее хотя-бы в этой мелочи, то мне будет лень его читать в следущий раз Я думаю это справедливо.
Отредактировано 4kpt_II (Дек. 24, 2013 01:23:11)
Офлайн
Кстати вот лично мое мнение- введение в питон разработчиками возможности такой конструкции- чудовищная ошибка. Наряду с известными опасностями зачастую ещё и код читать тяжелее (я не про ткинтер, а вообще)
Офлайн
4kpt_IIСпасибо. Я уже начал подходить к мысли, что нужно прямо указать геометрию
import Tkinter def show_list(long_list, root): root.geometry(“400x400+100+100”) root.focus_force()
Отредактировано vanvanov (Дек. 24, 2013 04:40:48)
Офлайн
Делает окно или виджет активным. Если сделать виджет, то и окно, на котором будет рассположен виджет станет активным.
Офлайн
А это всегда работает? Мне, сколько я не бился, не удалось добиться, чтобы вновь создаваемые окна всегда были активными. Иногда бывает, что окна, созданные одной и той же процедурой, иногда бывают активными, иногда - пассивными. Грешу на DE, потому что в некоторых средах, насколько я пробовал, такое не повторяется (Gnome 2).
Офлайн