import tkinter as tk
def add_selected():
selected_item = database_listbox.get(database_listbox.curselection())
selected_listbox.insert(tk.END, selected_item)
def remove_selected():
selected_item = selected_listbox.get(selected_listbox.curselection())
selected_listbox.delete(selected_listbox.curselection())
# 創建主視窗
window = tk.Tk()
# 創建左邊的 Listbox 顯示 database
database_frame = tk.Frame(window)
database_frame.pack(side=tk.LEFT, padx=10)
database_label = tk.Label(database_frame, text="Database")
database_label.pack()
database_listbox = tk.Listbox(database_frame)
database_listbox.pack()
# 加入假設的資料庫鍵值
database = {
"key1": "value1",
"key2": "value2",
"key3": "value3",
# ... 其他鍵值
}
for key in database.keys():
database_listbox.insert(tk.END, key)
# 創建中間的按鈕
button_frame = tk.Frame(window)
button_frame.pack(side=tk.LEFT)
add_button = tk.Button(button_frame, text=">>", command=add_selected)
remove_button = tk.Button(button_frame, text="<<", command=remove_selected)
add_button.pack(pady=10)
remove_button.pack(pady=10)
# 創建右邊的 Listbox 顯示已選擇的項目
selected_frame = tk.Frame(window)
selected_frame.pack(side=tk.LEFT, padx=10)
selected_label = tk.Label(selected_frame, text="已選擇")
selected_label.pack()
selected_listbox = tk.Listbox(selected_frame)
selected_listbox.pack()
# 啟動主視窗的事件迴圈
window.mainloop()
.curselection() 是一個 Tkinter Listbox 小部件的方法,用於獲取當前選擇的項目的索引。該方法返回一個包含所選項目索引的元組。#(0,)
例如,如果 Listbox 中的第一個項目被選中,則 .curselection() 方法將返回一個包含單個元素的元組,該元素是索引 0。如果沒有選擇的項目,則 .curselection() 方法將返回一個空的元組。
您可以使用 .curselection() 方法來獲取用戶在 Listbox 中選擇的項目的索引,然後根據需要進一步處理這些索引。
.get()
是 Tkinter Listbox 小部件的方法,用於獲取當前選擇的項目的值。
例如,如果 Listbox 中的第一個項目被選中且該項目的值為 “Apple”,則 .get()
方法將返回字符串 “Apple”。如果沒有選擇的項目,則 .get()
方法將返回空字符串。
您可以使用 .get()
方法來獲取用戶在 Listbox 中選擇的項目的值,然後根據需要進一步處理這些值。
實測listbox.get()中,放 selected_index #tuple (0,) or
selected_index[0] #int 0都可以正常執行
text.tag_ranges(tagName):
GUI:
code(加滾動條Scrollbar):
import tkinter as tk
def add_selected():
selected_index = database_listbox.curselection()
selected_cable = database_listbox.get(selected_index)
selected_database_text.insert(tk.END, selected_cable + ": ")
length_entry = tk.Entry(selected_database_text)
selected_database_text.window_create(tk.END, window=length_entry)
selected_database_text.insert(tk.END, "\n")
selected_cables[selected_cable] = length_entry
def remove_selected():
if selected_database_text.tag_ranges("sel"): #tagName="sel"
selected_text = selected_database_text.get("sel.first", "sel.last")
selected_database_text.delete("sel.first", "sel.last")
for cable in selected_cables: #selected_cables: dict
if selected_cables[cable].get() == selected_text:
#用in取代==比較好
del selected_cables[cable]
break
window = tk.Tk()
database_frame = tk.Frame(window)
database_frame.pack(side=tk.LEFT, padx=10)
database_label = tk.Label(database_frame, text="Database")
database_label.grid(row=0, column=0)
database_listbox = tk.Listbox(database_frame)
database_listbox.grid(row=1, column=0)
cable = {"UFA125A": [13.95, 0.4], "UED240E": [8.09, 0.76]}
for key in cable:
database_listbox.insert(tk.END, key)
database_scrollbar = tk.Scrollbar(database_frame)
database_scrollbar.grid(row=1, column=1, sticky=tk.N+tk.S)
database_listbox.config(yscrollcommand=database_scrollbar.set)
database_scrollbar.config(command=database_listbox.yview)
button_frame = tk.Frame(window)
button_frame.pack(side=tk.LEFT)
add_button = tk.Button(button_frame, text=">>", command=add_selected)
add_button.pack(pady=10)
remove_button = tk.Button(button_frame, text="<<", command=remove_selected)
remove_button.pack(pady=10)
selected_database_frame = tk.Frame(window)
selected_database_frame.pack(side=tk.LEFT, padx=10)
selected_database_text = tk.Text(selected_database_frame,
width=30,height=15)
selected_database_text.pack(side=tk.LEFT, fill=tk.Y)
selected_scrollbar = tk.Scrollbar(selected_database_frame, orient=tk.VERTICAL,
command=selected_database_text.yview)
selected_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
selected_database_text.config(yscrollcommand=
selected_scrollbar.set)
selected_cables = {}
# {"UFA125A": {(13.95, 0.4):[1,2,3,4]} }
# 同一條線會有一樣的K1,K2 (13.95, 0.4)
# https://www.carlisleit.com/micro-coax-insertion-loss-calculator/
# 但有四種不同的長度[1,2,3,4]
window.mainloop()
selected_database_text.window_create(tk.END, window=length_entry)
是一個用於在 Text
小部件中插入其他小部件的方法。這個方法將指定的小部件(length_entry
)插入到 Text
小部件的指定位置(tk.END
,表示在文本末尾插入)。
這個方法通常用於將小部件(如 Entry
)插入到 Text
中,以實現混合文本和輸入控制的效果。在這種情況下,Text
小部件充當了一個容器,用於顯示文本和其他小部件。
請注意,window_create
方法僅在 Text
小部件中使用,並且可以將其他小部件插入其中。對於其他小部件(例如 Label
)的插入,您可以使用相應的方法,如 Text
小部件的 insert
方法
window_create
方法是Text
小部件特有的方法,用於將其他小部件(如Entry
或Label
)插入到Text
小部件中的特定位置。它允許在Text
中創建一個視窗,並將其他小部件放置在該視窗中。這對於在Text
小部件中混合文本和小部件是非常有用的。insert
方法則是Text
小部件的通用插入方法,用於將文本或字符串插入到Text
小部件的指定位置。它可以在Text
小部件中插入純文本( str or StringVar.get() )或格式化的文本( f”{}” or .format() )。
總結來說,如果您希望在 Text
小部件中插入其他小部件,例如 Entry
或 Label
,則應使用 window_create
方法。如果您只是想在 Text
小部件中插入純文本或格式化的文本,則可以使用 insert
方法。
GUI:
以下是一些常見的常量示例:
TOP
:控件對齊或定位在垂直方向的頂部。BOTTOM
:控件對齊或定位在垂直方向的底部。CENTER
:控件在水平和垂直方向上居中對齊或定位。X
:控件在水平方向上擴展,填滿可用空間。Y
:控件在垂直方向上擴展,填滿可用空間。BOTH
:控件在水平和垂直方向上均擴展,填滿可用空間。
推薦hahow線上學習python: https://igrape.net/30afN