如果您对如何使Tkinter列表框适合内容和tkinter列表控件感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何使Tkinter列表框适合内容的各种细节,并对tkinter列表控件进行深入
如果您对如何使Tkinter列表框适合内容和tkinter列表控件感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何使Tkinter列表框适合内容的各种细节,并对tkinter列表控件进行深入的分析,此外还有关于Python tkinter 列表框Listbox属性详情、Python Tkinter多选列表框、Python tkinter自定义多选下拉列表框、Python Tkinter:为列表框中的每个字符串创建一个变量?的实用技巧。
本文目录一览:- 如何使Tkinter列表框适合内容(tkinter列表控件)
- Python tkinter 列表框Listbox属性详情
- Python Tkinter多选列表框
- Python tkinter自定义多选下拉列表框
- Python Tkinter:为列表框中的每个字符串创建一个变量?
如何使Tkinter列表框适合内容(tkinter列表控件)
我使用以下代码将字符串添加到列表框中。当我运行代码并打开窗口时,由于窗口不够大,因此会截断较长的字符串(请参见屏幕截图)。我试图使窗口可调整大小并添加滚动条,但是我想知道是否有一种自动调整窗口大小以适合内容的方法。
master = tk.Tk()listbox = tk.Listbox(master, selectmode=tk.SINGLE)games = ["Garry''s Mod", "Mount and Blade: Warband", "Tekkit"]for game in sorted(games): listbox.insert(tk.END, game)button = tk.Button(master, text="Execute", command=execute)listbox.pack()button.pack()tk.mainloop()
答案1
小编典典重置列表框宽度对我有用。我使用了遗忘的答案,并注意到宽度始终为零。
listbox = tk.Listbox(master, selectmode=tk.SINGLE)listbox.config(width=0)
我还建议在重新加载列表内容后重置根窗口的几何形状。否则,如果用户手动扩展窗口,则该窗口将停止容纳其内容的大小。
root.winfo_toplevel().wm_geometry("")
Python tkinter 列表框Listbox属性详情
前言:
列表框控件显示多行文本,用户可以选中一行或者多行。所有的文本只能使用一种字体,不能混合使用多种字体。
1 属性
常用的参数列表如下:
1.1 activestyle
设置列表框被选中的文本行的显示效果。有三种:
underline: 下划线 | |
dotbox:点划线虚框 | |
none: 没有显示效果 |
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,activedotbox'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
1.2 background(bg)
设置列表框背景颜色:
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,bg=''green'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
1.3 borderwidth(bd)
设置列表框的边框宽度。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,bd=10) for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
1.4 cursor
鼠标位于列表框区域时,鼠标的形状。详细的cursor说明见3.3.6节。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,cursor=''spider'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
1.5 disabledforeground
列表框的状态为tk.DISABLED时,列表框的文本颜色。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,disabledforeground=''red'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() b1.config(state=tk.DISABLED) root.mainloop()
结果:
1.6 exportselection
决定是否可以复制选中的文本内容。如果exportselection=True,表示可以。exportselection=False,表示不可复制列表框中选中的选项。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,exportselection=0) for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
1.7 font
设置列表框字体。所有的文本只能有一种字体,不能混合多种字体。具体的文本说明见3.3.3节。
1.8 foreground(fg)
设置列表框中的文本颜色。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,fg=''blue'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
1.9 height
设置列表框的高度。单位是行。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,height=5) for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
设置列表框的高度。默认是10行。
1.10 highlightbackground、highlightcolor和highlightthickness
设置列表框获得或者失去输入焦点时候的边框颜色。这两种边框的宽度由highlightthickness设置。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,highlightbackground=''blue'', highlightcolor=''red'',highlightthickness=10) for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
1.11 listvariable
listvariable 可以与一个tk.StringVar()变量相关联。可以通过变量的get()方法,获得列表框中的所有的文本内容。也可以通过set(s)的方法来设置列表框中的内容。
#获得列表框的内容 import tkinter as tk root=tk.Tk() root.geometry(''300x240'') content=tk.StringVar() b1=tk.Listbox(root,listvariable=content) for i in range(1,11): b1.insert(tk.END,i) b1.pack() print(content.get()) root.mainloop()
#设置列表框中的内容 import tkinter as tk root=tk.Tk() root.geometry(''300x240'') content=tk.StringVar() b1=tk.Listbox(root,listvariable=content) for i in range(1,11): b1.insert(tk.END,i) b1.pack() def lst(): content.set(''abc def "c c" c bbb'') b2=tk.Button(root,text=''Set'',command=lst) b2.pack() root.mainloop()
结果:
说明:
- (1)使用set(s)会取代以前的列表框中的内容
- (2)s是用空格分隔的字符串。多个空格会被认为是1个。如果选项中需要有空格,请用引号把这个字符串括起来。比如”c c”。
1.12 relief
设置列表框边框的3D效果。
1.13 selectbackground
选中条目的背景颜色。默认值是蓝色。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,selectbackground=''red'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
1.14 selectborderwidth
表示选中的矩形的边框宽度。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,selectborderwidth=5) for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
说明:可以看到间距明显比不设置selectborderwidth加大了。
1.15 selectforeground
选中后的文本颜色。目前是反白的显示,也可以通过selectforeground来设定。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,selectforeground=''red'') for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
结果:
1.16 selectmode
设定列表框中条目的选择模式:
- (1)tk.BROWSE: 可以通过鼠标拖动的方式选择条目。一次只能选中一行
- (2)tk.SINGLE: 一次只能选中一个条目。不支持鼠标拖动模式选择。
- (3)tk.MULTIPLE: 可以选择多个条目。如果该条目已经选中,再次点击变为未选中
- (4)tk.EXTENDED :支持使用如下模式选择:
拖动选择。鼠标拖动,在鼠标经过的条目都被选中
Shift:先鼠标点击选中一个条目,然后按照shift键,鼠标点击另外的条目,则这2个条目之间的所有条目都被选中
Ctrl: 按住ctrl键,同时点击一个条目,则该条目被选中。一次只能增加一个被选中的条目。如果该条目已经被选中,则状体变为未选中。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') b1=tk.Listbox(root,selectmode=tk.SINGLE) for i in range(1,11): b1.insert(tk.END,i) b1.pack() root.mainloop()
1.17 takefocus
设置是否可以通过Tab移动输入焦点到列表框上。
1.18 state
设置列表框的状态。有二种:DISABLED或者NORMAL。
1.19 width
设置列表框的宽度。默认是20个字符。
1.20 xscrollcommand
设置水平滚动条。详细的用法见yscrollcommand。
1.21 yscrollcommand
设置垂直滚动条。
import tkinter as tk root=tk.Tk() root.geometry(''300x240'') content=tk.StringVar() content.set(''1 2 3 jjjjjjjjjjjjjjjjjjjjjjjjjjj\ jjjjjjjjjjjjjj 4 5 6 7 8 9 10'') f=tk.Frame(root) s1 = tk.Scrollbar(f,orient=tk.HORIZONTAL) s2 = tk.Scrollbar(f,orient=tk.VERTICAL) b1 = tk.Listbox(f,width=10,height=5,listvariable=content, xscrollcommand=s1.set,yscrollcommand=s2.set) s1.pack(side=tk.BOTTOM,fill=tk.X) s1.config(command=b1.xview) s2.pack(side=tk.RIGHT,fill=tk.Y) s2.config(command=b1.yview) b1.pack() f.pack() root.mainloop()
结果:
到此这篇关于Python tkinter 列表框Listbox属性详情的文章就介绍到这了,更多相关Python 列表框Listbox内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- Python 窗体(tkinter)下拉列表框(Combobox)实例
- python使用tkinter模块实现文件选择功能
- python图形用户界面tkinter之按钮Button的使用说明
- Python使用Tkinter GUI实现输入验证功能
- Python Tkinter GUI编程实现Frame切换
- Python+Tkinter制作专属图形化界面
- Python中Tkinter组件Listbox的具体使用
- Python wxPython库使用wx.ListBox创建列表框示例
- wxPython中listbox用法实例详解
Python Tkinter多选列表框
我在这里尝试搜索,但没有找到正确的答案。
我有一个使用设置的列表框selection=''multiple''
。然后,我尝试通过代码获得用户选择的所有选项的列表name.get(ACTIVE)
。问题是它并不能总是获得我在列表框GUI中突出显示的所有选项。
如果我突出显示一个,它将正确地带回。
如果我突出显示两个或更多(每次单击一次),则仅返回我选择的最后一个项目。
如果我突出显示了多个,但是单击以取消突出显示,则即使我未突出显示,也是我单击的最后一个项目。
任何帮助都将非常棒。谢谢。我希望代码能带回突出显示的内容。
设置列表框的代码是:
self.rightBT3 = Listbox(Frame1,selectmode=''multiple'',exportselection=0)
检索选择的代码是:
selection = self.rightBT3.get(ACTIVE)
这是该应用程序实际运行情况的屏幕截图,在顶部可以看到控制台仅注册了一个选择(我单击的最后一个)。
答案1
小编典典似乎在Tkinter列表框中获取选定项目列表的正确方法是使用self.rightBT3.curselection()
,它返回一个包含选定行的从零开始的索引的元组。然后,您可以get()
使用这些索引来每一行。
(虽然我还没有实际测试过)
Python tkinter自定义多选下拉列表框
Python tkinter 自定义多选下拉列表框
困扰了我好久,终于在stackoverflow上找到了答案。
废话不多说,直接上代码!
demo.py文件
from tkinter import *
from ComBoPicker import Combopicker# 导入自定义下拉多选框
if __name__ == "__main__":
root = Tk()
root.geometry("200x200")
main =Frame(root)
main.pack(expand=False, fill="both")
COMBOPICKER1 = Combopicker(main, values = ['CELL-S1','CELL-S2','CELL-S3','CELL-S4'])
COMBOPICKER1.pack(anchor="w")
root.mainloop()
ComBoPicker.py文件
'''
自定义多选下拉列表
'''
import tkinter.font as tkFont
import tkinter.ttk as ttk
from tkinter import *
class Picker(ttk.Frame):
def __init__(self, master=None,activebackground='#b1dcfb',values=[],entry_wid=None,activeforeground='black', selectbackground='#003eff', selectforeground='white', command=None, borderwidth=1, relief="solid"):
self._selected_item = None
self._values = values
self._entry_wid = entry_wid
self._sel_bg = selectbackground
self._sel_fg = selectforeground
self._act_bg = activebackground
self._act_fg = activeforeground
self._command = command
ttk.Frame.__init__(self, master, borderwidth=borderwidth, relief=relief)
self.bind("<FocusIn>", lambda event:self.event_generate('<<PickerFocusIn>>'))
self.bind("<FocusOut>", lambda event:self.event_generate('<<PickerFocusOut>>'))
self._font = tkFont.Font()
self.dict_checkbutton = {}
self.dict_checkbutton_var = {}
self.dict_intvar_item = {}
for index,item in enumerate(self._values):
self.dict_intvar_item[item] = Intvar()
self.dict_checkbutton[item] = ttk.Checkbutton(self, text = item, variable=self.dict_intvar_item[item],command=lambda ITEM = item:self._command(ITEM))
self.dict_checkbutton[item].grid(row=index, column=0, sticky=NSEW)
self.dict_intvar_item[item].set(0)
class Combopicker(ttk.Entry, Picker):
def __init__(self, master, values= [] ,entryvar=None, entrywidth=None, entrystyle=None, onselect=None,activebackground='#b1dcfb', activeforeground='black', selectbackground='#003eff', selectforeground='white', borderwidth=1, relief="solid"):
if entryvar is not None:
self.entry_var = entryvar
else:
self.entry_var = StringVar()
entry_config = {}
if entrywidth is not None:
entry_config["width"] = entrywidth
if entrystyle is not None:
entry_config["style"] = entrystyle
ttk.Entry.__init__(self, master, textvariable=self.entry_var, **entry_config, state = "readonly")
self._is_menuoptions_visible = False
self.picker_frame = Picker(self.winfo_toplevel(), values=values,entry_wid = self.entry_var,activebackground=activebackground, activeforeground=activeforeground, selectbackground=selectbackground, selectforeground=selectforeground, command=self._on_selected_check)
self.bind_all("<1>", self._on_click, "+")
self.bind("<Escape>", lambda event: self.hide_picker())
@property
def current_value(self):
try:
value = self.entry_var.get()
return value
except ValueError:
return None
@current_value.setter
def current_value(self, INDEX):
self.entry_var.set(values.index(INDEX))
def _on_selected_check(self, SELECTED):
value = []
if self.entry_var.get() != "" and self.entry_var.get() != None:
temp_value = self.entry_var.get()
value = temp_value.split(",")
if str(SELECTED) in value:
value.remove(str(SELECTED))
else:
value.append(str(SELECTED))
value.sort()
temp_value = ""
for index,item in enumerate(value):
if item!= "":
if index != 0:
temp_value += ","
temp_value += str(item)
self.entry_var.set(temp_value)
def _on_click(self, event):
str_widget = str(event.widget)
if str_widget == str(self):
if not self._is_menuoptions_visible:
self.show_picker()
else:
if not str_widget.startswith(str(self.picker_frame)) and self._is_menuoptions_visible:
self.hide_picker()
def show_picker(self):
if not self._is_menuoptions_visible:
self.picker_frame.place(in_=self, relx=0, rely=1, relwidth=1 )
self.picker_frame.lift()
self._is_menuoptions_visible = True
def hide_picker(self):
if self._is_menuoptions_visible:
self.picker_frame.place_forget()
self._is_menuoptions_visible = False
out:
Python Tkinter:为列表框中的每个字符串创建一个变量?
如何解决Python Tkinter:为列表框中的每个字符串创建一个变量??
我(几乎)是一个糟糕的程序员处女,所以请对我放轻松。
这是我第二次尝试制作程序,但结果证明这有点超出我的能力范围,恐怕。在尝试解决这个问题很长时间后,我请求您的帮助。
我基本上是在做一个待办事项列表,但希望它有更多的功能,而不仅仅是一个无聊的列表。
我在脑海中的想象是,用户将任务添加到条目小部件中,然后该小部件将显示在列表框中。然后列表框中的每个字符串都有一个与之关联的值(我需要对我希望程序具有的功能进行一些计算)。 所以我想我想要的是 ListBox 中的每个字符串都成为一个变量,然后与该变量关联我想要一个值。
我会尽力向您展示:
这里我添加了我想成为新变量的字符串
然后我从下拉菜单中指定一个数字。我希望这个数字是上一步中变量/字符串的值。
我真的希望你们中的一个人能以一种(最好)不需要我对事情做太多改变的方式引导我走向正确的方向。事情对我来说仍然很棘手,我已经很难浏览代码了。 目的很简单,我想对与每个任务相关联的(希望)即将成为的值进行一些计算。 如果你们有胆量,请提前致谢!
相关代码在这里:
import tkinter.messageBox # Import the messageBox module
import pickle # Module to save to .dat
import tkinter as tk
root = tk.Tk() #
root.title(''SmaTodo'') # Name of the program/window
def new_task():
global entry_task
global task_window
task_window = Toplevel(root)
task_window.title(''Add a new task'')
task_label = tk.Label(task_window,text = ''Title your task concisely:'',justify=''center'')
task_label.pack()
# Entry for tasks in new window
entry_task = tkinter.Entry(task_window,width=50,justify=''center'')
entry_task.pack()
# Add task button in new window
button_add_task = tkinter.Button(task_window,text=''Add task'',width=42,command=lambda: [add_task(),impact()])
button_add_task.pack()
def add_task():
global task
global impact_window
task = entry_task.get() # we get the task from entry_task and we get the input from the entry_task type-field with .get()
if task != '''': # If textBox inputfield is NOT empty do this:
listBox_tasks.insert(tkinter.END,task)
entry_task.delete(0,tkinter.END) # Slet hvad der står i inputfeltet fra første bogstav til sidste (0,tkinter.END)
task_window.destroy()
else:
tkinter.messageBox.showwarning(title=''Whoops'',message=''You must enter a task'')
task_window.destroy()
def delete_task():
try:
task_index = listBox_tasks.curselection()[0]
listBox_tasks.delete(task_index)
except:
tkinter.messageBox.showwarning(title=''Oops'',message=''You must select a task to delete'')
def save_tasks():
tasks = listBox_tasks.get(0,listBox_tasks.size())
pickle.dump(tasks,open(''tasks.dat'',''wb''))
def prioritize_tasks():
pass
# Create UI
frame_tasks = tkinter.Frame(root)
frame_tasks.pack()
scrollbar_tasks = tkinter.Scrollbar(frame_tasks)
scrollbar_tasks.pack(side=tkinter.RIGHT,fill=tkinter.Y)
listBox_tasks = tkinter.ListBox(frame_tasks,height=10,justify=''center'') # tkinter.ListBox(where it should go,height=x,width=xx)
listBox_tasks.pack()
listBox_tasks.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listBox_tasks.yview)
try:
tasks = pickle.load(open(''tasks.dat'',''rb''))
listBox_tasks.delete(0,tkinter.END)
for task in tasks:
listBox_tasks.insert(tkinter.END,task)
except:
tkinter.messageBox.showwarning(title=''Phew'',message=''You have no tasks'')
# Add task button
button_new_task = tkinter.Button(root,text=''New task'',command=new_task)
button_new_task.pack()
button_delete_task = tkinter.Button(root,text=''Delete task'',command=delete_task)
button_delete_task.pack()
button_save_tasks = tkinter.Button(root,text=''Save tasks'',command=save_tasks)
button_save_tasks.pack()
button_prioritize_tasks = tkinter.Button(root,text=''Prioritize'',command=prioritize_tasks)
button_prioritize_tasks.pack()
root.mainloop()
解决方法
简单的方法是添加另一个 list
来存储影响值。您需要同步任务列表和影响列表。
以下是修改后的代码:
import pickle # Module to save to .dat
import tkinter as tk
from tkinter import messagebox
import random
TASKS_FILE = "tasks.dat"
task_impacts = [] # store impact of tasks
root = tk.Tk() #
root.title(''SmaToDo'') # Name of the program/window
def impact():
# assign random impact to new task
task_impacts.append(random.randint(1,11))
def new_task():
def add_task():
task = entry_task.get().strip()
if task:
listbox_tasks.insert(tk.END,task)
impact() # get the impact of the task
else:
messagebox.showwarning(title=''Whoops'',message=''You must enter a task'')
task_window.destroy()
task_window = tk.Toplevel(root)
task_window.title(''Add a new task'')
task_label = tk.Label(task_window,text = ''Title your task concisely:'',justify=''center'')
task_label.pack()
# Entry for tasks in new window
entry_task = tk.Entry(task_window,width=50,justify=''center'')
entry_task.pack()
# Add task button in new window
button_add_task = tk.Button(task_window,text=''Add task'',width=42,command=add_task)
button_add_task.pack()
def delete_task():
try:
task_index = listbox_tasks.curselection()[0]
listbox_tasks.delete(task_index)
task_impacts.pop(task_index) # remove corresponding impact value as well
except:
messagebox.showwarning(title=''Oops'',message=''You must select a task to delete'')
def load_tasks():
try:
with open(TASKS_FILE,''rb'') as f:
tasks = pickle.load(f)
listbox_tasks.delete(0,tk.END)
task_impacts.clear()
for task,impact in tasks:
listbox_tasks.insert(tk.END,task)
task_impacts.append(impact)
except:
messagebox.showwarning(title=''Phew'',message=''You have no tasks'')
def save_tasks():
tasks = zip(listbox_tasks.get(0,tk.END),task_impacts)
with open(TASKS_FILE,"wb") as f:
pickle.dump(tasks,f)
def prioritize_tasks():
print(list(zip(listbox_tasks.get(0,task_impacts)))
# Create UI
frame_tasks = tk.Frame(root)
frame_tasks.pack()
scrollbar_tasks = tk.Scrollbar(frame_tasks)
scrollbar_tasks.pack(side=tk.RIGHT,fill=tk.Y)
listbox_tasks = tk.Listbox(frame_tasks,height=10,justify=''center'') # tkinter.Listbox(where it should go,height=x,width=xx)
listbox_tasks.pack()
listbox_tasks.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listbox_tasks.yview)
# Add task button
button_new_task = tk.Button(root,text=''New task'',command=new_task)
button_new_task.pack()
button_delete_task = tk.Button(root,text=''Delete task'',command=delete_task)
button_delete_task.pack()
button_save_tasks = tk.Button(root,text=''Save tasks'',command=save_tasks)
button_save_tasks.pack()
button_prioritize_tasks = tk.Button(root,text=''Prioritize'',command=prioritize_tasks)
button_prioritize_tasks.pack()
load_tasks()
root.mainloop()
请注意,我有:
- 将
add_task()
函数移到new_task()
函数中以不使用全局变量 - 创建了缺失的
impact()
函数来为新任务分配一个随机影响值 - 在函数
load_tasks()
中移动了已保存任务的加载
更好的建议是使用 ttk.Treeview()
而不是 tk.Listbox()
,因为您可以使用 tags
或 text
选项将影响值与任务相关联{{ 1}}。
关于如何使Tkinter列表框适合内容和tkinter列表控件的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Python tkinter 列表框Listbox属性详情、Python Tkinter多选列表框、Python tkinter自定义多选下拉列表框、Python Tkinter:为列表框中的每个字符串创建一个变量?的相关信息,请在本站寻找。
本文标签: