LINUX.ORG.RU

Сжатие окна в Tkinter

 


0

1

Python 3. Необходимо создать с помощью Tkinter меню выбора команд. Создается окно, в нем перечисляются пронумерованные команды, и пользователь вводит в текстовое поле под списком номер нужной команды. Есть такой код:

#!/usr/bin/python3
from tkinter import *

menu_font=12

def start_selection():
	def callback(): res[0]=my_sel.get(); top.destroy(); root.deiconify()
	res = [None]
	top=Toplevel()
	top.title('Выберите, что нужно делать:')
	top.lift()
	root.withdraw()
	scrollbar = Scrollbar(top,jump=0)
	my_frame=Canvas(top,yscrollcommand=scrollbar.set)
	my_label=Label(my_frame,text="0. Выйти\n1. Команда 1\n2. Команда 2\n3. Команда 3\n...\n100. Команда 100",font=menu_font)
	my_label.pack()
	scrollbar.config(command=my_frame.yview)
	scrollbar.pack(side=RIGHT,fill=Y)
	my_sel=Entry(my_frame,font=menu_font)
	my_sel.pack(side=BOTTOM)
	my_sel.focus_set()
	# Выход по нажатию Enter
	my_sel.bind('<Return>', lambda e: callback())
	my_frame.pack()
	top.wait_window(top)
	return res[0]

root=Tk()
print(start_selection())
root.mainloop()
Окно получается типа такого. Проблема в том, что список может быть длинным, и на нетбуке нижняя часть экрана обрезается. Как исправить?

Deleted

это у вас лаба что-ли ??

вообще-то это (выбор команд из списка) делается одним listbox`ом или menu без привлечения canvas и entry.

hint: заменить label на listbox и скролл цеплять на него, а не на весь фрейм.

MKuznetsov ★★★★★ ()

Сделал двумя Listbox.

Deleted ()
Ответ на: комментарий от Deleted

это у вас лаба что-ли ??

Нет. У меня, вообще говоря, специальность совсем другая :)

просто подход к интерфейсу странный - зачем-то канва и поле ввода для выбора вариантов. Такое бывает у студентов когда их ограничивают в использовании средств ;-)

дарю: подправленная вырезка из старых проектов (listbox с фильтром), перевод на python c tk-inter думаю затруднений не вызовет.

#!/usr/bin/tclsh

proc fill_listbox { w values } {
	$w delete 0 end
	set values [ lsort -unique -dictionary $values ]
	foreach item  $values {
		$w insert end $item
	}
	$w see 0
}
proc colored_bell { w color } {
	set bg [ $w cget -background ]
	bell -displayof [ winfo toplevel $w ]
	if { $bg != $color  } {
		$w configure -background $color
		update idletasks
		after 100 [ list $w configure -background $bg ]
	}
}
proc filter { w variants S } {
	if { $S == {} } {
		fill_listbox $w.ls $variants
		return 1
	}
	set f [ lsearch -all -inline -nocase -glob $variants *$S* ] 
	if { $f != {} } {
		fill_listbox $w.ls $f
		return 1
	}
	colored_bell $w.input "red"
	return 0
}
proc choice { w variants } {
	frame $w
	listbox $w.ls
	scrollbar $w.hscroll
	entry $w.input

	pack $w.input -side top -fill x
	pack $w.ls -side left -fill both -expand yes
	pack $w.hscroll -side left -fill y 

	$w.ls configure -yscrollcommand [ list $w.hscroll set ]
	$w.hscroll configure -command [ list $w.ls yview ]

	$w.input configure -validate key -validatecommand [ list filter $w $variants %P ]

	fill_listbox $w.ls $variants
	return $w
}
choice .w [ encoding names ]
pack .w -expand yes -fill both

tkwait window .

MKuznetsov ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.