Вопрос: Я хотел бы создать список, который будет отображаться и исчезать под меткой1, но он не должен влиять на положение метки2 при нажатии метки1. Как это может быть сделано?tkinter: Как создать список, который может появляться и исчезать над другим виджетами без перемещения другого виджета?
Фон: Я написал тестовый код (см. Ниже), чтобы показать свою проблему. При первом щелчке мыши появляется список, но нажимает label2 вниз. При втором щелчке мыши скрывается список, но label2 остается в новом месте и не возвращается в исходное положение. Я попытался использовать .grid_forget(), но получил то же поведение. Повторные щелчки мыши просто отображают и скрывают список.
Я думаю, что я не могу получить желаемое поведение виджета, потому что список - это сетка в той же плоскости/окне, что и другие виджеты. Так, я думаю, что окно верхнего уровня - это другой виджет, который позволяет существовать виджет вне плоскости? Если да, то как мне это сделать? Как разместить его ниже label1? Кроме того, окна верхнего уровня имеют строку заголовка окна. Я не хочу этого. Как удалить это? Правильно ли мой процесс мышления, чтобы получить то, что я хочу?
#!/usr/bin/python3
# -*- coding: utf-8 -*-
try:
import tkinter as tk # Python 3 tkinter modules
except ImportError:
import Tkinter as tk # Python 2 tkinter modules
class App(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.grid(row=0, column=0, sticky='nsew')
self.toggle = True
self.label1 = tk.Label(self, text = 'Click me to see Names of Famous Folks')
self.lbframe = tk.Frame(self)
self.label2 = tk.Label(self, text = 'The World of Famous Folks! Welcome!')
self.label1.grid(row=0, column=0, sticky='nsew', pady=10)
self.lbframe.grid(row=1, column=0, sticky='nsew')
self.label2.grid(row=2, column=0, sticky='nsew')
nlist1 = ['Peter', 'Scotty', 'Walter', 'Scott', 'Mary']
self.lbframe.list_values = tk.StringVar()
self.lbframe.list_values.set(nlist1)
self.lbframe.list= tk.Listbox(self.lbframe, height=5, width= 10,
listvariable=self.lbframe.list_values)
self.lbframe.list.grid(row=0, column=0, sticky='nsew')
self.lbframe.list.grid_remove()
self.label1.bind("<Button-1>", self.ShowHideListbox)
def ShowHideListbox(self, event):
if self.toggle: # Show
self.toggle=False
self.lbframe.list.grid()
self.lbframe.list.lift(aboveThis=None)
else: # Hide
self.toggle=True
self.lbframe.list.grid_remove()
if __name__ == '__main__':
root = tk.Tk()
app = App(root)
app.mainloop()
похоже, что вы пытаетесь имитировать выпадающий список. есть ли причина, по которой вы не используете combobox? –
, если вы хотите переместить 'label2' вверх, затем скройте' lbframe' - 'self.lbframe.grid_forget()', а затем используйте 'self.lbframe.list.grid (row = 1, column = 0, sticky = 'nsew') ', чтобы показать это снова между двумя метками. – furas