Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的GUI ?

加入好友
加入社群
Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的GUI ? - 儲蓄保險王
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):

Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的GUI ? - 儲蓄保險王

GUI:

Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的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 小部件特有的方法,用於將其他小部件(如 EntryLabel)插入到 Text 小部件中的特定位置。它允許在 Text 中創建一個視窗,並將其他小部件放置在該視窗中。這對於在 Text 小部件中混合文本和小部件是非常有用的。
  • insert 方法則是 Text 小部件的通用插入方法,用於將文本或字符串插入到 Text 小部件的指定位置。它可以在 Text 小部件中插入純文本( str or StringVar.get() )或格式化的文本( f”{}” or .format() )

總結來說,如果您希望在 Text 小部件中插入其他小部件,例如 EntryLabel,則應使用 window_create 方法。如果您只是想在 Text 小部件中插入純文本或格式化的文本,則可以使用 insert 方法。
GUI:

Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的GUI ? - 儲蓄保險王

以下是一些常見的常量示例:

  1. TOP:控件對齊或定位在垂直方向的頂部。
  2. BOTTOM:控件對齊或定位在垂直方向的底部。
  3. CENTER:控件在水平和垂直方向上居中對齊或定位。
  4. X:控件在水平方向上擴展,填滿可用空間。
  5. Y:控件在垂直方向上擴展,填滿可用空間。
  6. BOTH:控件在水平和垂直方向上均擴展,填滿可用空間。
Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的GUI ? - 儲蓄保險王

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python: 如何用tkinter做出左右兩邊的listbox,中間放箭頭符號,用來新增/移除選擇項目的GUI ? - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *