Найти - Пользователи
Полная версия: Tkinter: расположение элементов
Начало » GUI » Tkinter: расположение элементов
1
vanvanov
Здравствуйте!
Есть такой код:
#!/usr/bin/python3
import tkinter as tk
res=[0]
tk_lst=[['1.0','1.4'],['1.5','1.10'],['1.11','1.15']]
# Выделение терминов
def select_term():
	pos1=tk_lst[res[0]][0]
	pos2=tk_lst[res[0]][-1]
	txt.tag_add('terms',pos1,pos2)
	txt.tag_config('terms',background='cyan')
# Перейти на предыдущий термин
def move_left(event):
	txt.tag_remove('terms','1.0','end')
	if res[0] > 0:
		res[0]-=1
	select_term()
# Перейти на следующий термин
def move_right(event):
	txt.tag_remove('terms','1.0','end')
	if res[0]+1 < len(tk_lst):
		res[0]+=1
	select_term()
root=tk.Tk()
frame_txt=tk.Frame(root)
frame_txt.pack()
frame_panel=tk.Frame(root)
frame_panel.pack()
entry=tk.Entry(frame_panel)
entry.pack(side='left')
button_flag=tk.Button(frame_panel,text='Флаг')
button_flag.pack(side='left')
button_quit=tk.Button(frame_panel,text='Выйти')
button_quit.pack(side='left')
txt=tk.Text(frame_txt)
txt.pack(expand=1,fill='both')
txt.insert('1.0','Папа любит маму.')
txt.config(state='disabled')
txt.bind('<Left>',move_left)
txt.bind('<Right>',move_right)
txt.focus_force()
root.mainloop()
В элементе txt (текстовое поле с неизменяемым текстом) происходит выделение слов с помощью стрелок, в entry можно вводить текст, ну и кнопки, само собой, можно нажимать.
Проблема заключается в том, что после того, как я переключаюсь на entry для ввода текста, я уже не могу работать с txt: Tab, Shift+Tab или ЛКМ не позволяют взять txt в фокус (при этом после кнопок это можно сделать). Если отключить state='disabled', то все начинает работать, однако, тут много работы надо будет сделать вручную: убрать курсор (если это вообще возможно), не давать менять текст при нажатии клавиш. Соответственно, у меня 2 вопроса:
1. Как изменить код так, чтобы можно было переключаться на txt с помощью клавиатуры и мыши?
2. Можно ли с помощью pack (grid не знаю) сделать так, чтобы кнопка button_flag была слева, элемент entry - по центру, кнопка button_quit - справа?
terabayt
import tkinter as tk
res=[0]
tk_lst=[['1.0','1.4'],['1.5','1.10'],['1.11','1.15']]
# Выделение терминов
def select_term():
    pos1=tk_lst[res[0]][0]
    pos2=tk_lst[res[0]][-1]
    txt.tag_add('terms',pos1,pos2)
    txt.tag_config('terms',background='cyan')
# Перейти на предыдущий термин
def move_left(event):
    txt.tag_remove('terms','1.0','end')
    if res[0] > 0:
        res[0]-=1
    select_term()
# Перейти на следующий термин
def move_right(event):
    txt.tag_remove('terms','1.0','end')
    if res[0]+1 < len(tk_lst):
        res[0]+=1
    select_term()
root=tk.Tk()
frame_txt=tk.Frame(root)
frame_txt.pack()
frame_panel=tk.Frame(root)
frame_panel.pack()
button_flag=tk.Button(frame_panel,text='Флаг')
button_flag.pack(side='left')
entry=tk.Entry(frame_panel)
entry.pack(side='left')
button_quit=tk.Button(frame_panel,text='Выйти')
button_quit.pack(side='left')
txt=tk.Text(frame_txt)
txt.pack(expand=1,fill='both')
txt.insert('1.0','Папа любит маму.')
txt.config(state='disabled')
txt.bind('<Left>',move_left)
txt.bind('<Right>',move_right)
txt.bind('<Button 1>', lambda x: txt.focus())
txt.focus_force()
root.mainloop()
vanvanov
terabayt
txt.bind('<Button 1>', lambda x: txt.focus())
Спасибо! А Tkinter вообще позволяет переключаться между разными элементами с помощью Tab и Shift+Tab, если есть несколько Frame, а не один?
4kpt_II
Вопрос лишен смысла. Вы можете сами указывать возможность получения фокуса (свойство takefocus). В результате Вы можете указать виджет, который никогда не получит фокуса, если явно на него не нажать. Кроме того, расположение виджетов в коде также отвечает за переход фокуса. Явно задавать переход фокуса можно функцией .focus_force(). Да и .bind никто не отменял
vanvanov
Что-то я стормозил. Чтобы перейти с search_field на txt, надо делать
txt.bind('<F6>',lambda x:search_field.focus())
search_field.bind('<F6>',lambda x:txt.focus())
а я почему-то указал
txt.bind('<F6>',lambda x:txt.focus())
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