最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何實現(xiàn)Python編寫的圖形界面可以自由拖動

 更新時間:2024年11月15日 08:51:03   作者:PythonFun  
我們使用python中的tkinter進(jìn)行編程時,往往需要一種功能就是我們可以隨意拖動這個界面,放置在任何位置,下面我們就來看看Python如何實現(xiàn)這一效果吧

一、問題的提出

我們使用python中的tkinter進(jìn)行編程時,往往需要一種功能就是我們可以隨意拖動這個界面,放置在任何位置,而不是只能拖動標(biāo)題欄,這樣使我們的程序用起來更加便捷和絲滑。

二、問題分析

如果要實現(xiàn)這種方法,我們可以定義函數(shù),也可以做一個裝飾器,到時相當(dāng)于給我們的程序添加了一個新的功能一樣,這樣的邏輯就更好理解了。

三、問題的解決

1. 直接用函數(shù)的方法

這種方法是最原始的,我們可以直接把它加入到以函數(shù)寫法的程序中,通過定義兩個函數(shù),包括on_drag_start和on_drag_motion,通過獲取鼠標(biāo)的新位置,來實現(xiàn)界面的位置移動。

import tkinter as tk
 
def on_drag_start(event):
    global x_start, y_start
    x_start = event.x_root
    y_start = event.y_root
 
def on_drag_motion(event):
    global x_start, y_start
    delta_x = event.x_root - x_start
    delta_y = event.y_root - y_start
    x_new = root.winfo_x() + delta_x
    y_new = root.winfo_y() + delta_y
    root.geometry(f"+{x_new}+{y_new}")
 
    x_start = event.x_root
    y_start = event.y_root
 
root = tk.Tk()
root.geometry("400x300")
 
# 僅將事件處理程序綁定到根窗口的背景上
root.bind('<Button-1>', on_drag_start)
root.bind('<B1-Motion>', on_drag_motion)
 
# 添加一個示例控件
button = tk.Button(root, text="按鈕")
button.pack(pady=20)
 
label = tk.Label(root, text="移動窗口")
label.pack(pady=20)
 
root.mainloop()

2. 通過裝飾器來實現(xiàn)

雖然函數(shù)的方法就可以實現(xiàn),那么我們可以把這兩個函數(shù)放在裝飾器里面,調(diào)用時用@函數(shù)名就可以了。在下面的代碼中,我們定義了一個draggable_window這個裝飾器,可以用于為函數(shù)添加新的功能。我們create_window()前面添加了@draggable_window,這樣就可以為新窗口添加新功能了。

import tkinter as tk
 
def draggable_window(func):
    def wrapper(*args, **kwargs):
        root = func(*args, **kwargs)
        
        def on_drag_start(event):
            root.x_start = event.x_root
            root.y_start = event.y_root
 
        def on_drag_motion(event):
            delta_x = event.x_root - root.x_start
            delta_y = event.y_root - root.y_start
            x_new = root.winfo_x() + delta_x
            y_new = root.winfo_y() + delta_y
            root.geometry(f"+{x_new}+{y_new}")
 
            root.x_start = event.x_root
            root.y_start = event.y_root
 
        root.bind('<Button-1>', on_drag_start)
        root.bind('<B1-Motion>', on_drag_motion)
        
        return root
    return wrapper
 
@draggable_window
def create_window():
    root = tk.Tk()
    root.geometry("400x300")
 
    # 添加控件
    button = tk.Button(root, text="按鈕")
    button.pack(pady=20)
 
    label = tk.Label(root, text="移動窗口")
    label.pack(pady=20)
 
    return root
 
# 啟動窗口
root = create_window()
root.mainloop()

DraggableWindow 類封裝了窗口的創(chuàng)建、拖動功能和控件的添加。

on_drag_start 和 on_drag_motion 方法分別處理拖動的起點和拖動過程。

add_widgets 方法用于向窗口添加按鈕和標(biāo)簽。

run 方法啟動 mainloop(),以顯示窗口。

3. 把裝飾器寫成類去裝飾另一個程序添加新功能

我們還可以定義完裝飾器后放入一個類中,直接去修飾另一個類,代碼如下,注意裝飾器的位置。這樣的寫法邏輯分明,條理清楚,不想使用這個拖動這個功能,直接刪除裝飾器的類,就可以了。

import tkinter as tk
 
# 定義拖動功能的裝飾器
def draggable(func):
    def wrapper(self, *args, **kwargs):
        func(self, *args, **kwargs)
        
        def on_drag_start(event):
            self.x_start = event.x_root
            self.y_start = event.y_root
 
        def on_drag_motion(event):
            delta_x = event.x_root - self.x_start
            delta_y = event.y_root - self.y_start
            x_new = self.root.winfo_x() + delta_x
            y_new = self.root.winfo_y() + delta_y
            self.root.geometry(f"+{x_new}+{y_new}")
 
            self.x_start = event.x_root
            self.y_start = event.y_root
 
        # 將拖動事件綁定到窗口
        self.root.bind('<Button-1>', on_drag_start)
        self.root.bind('<B1-Motion>', on_drag_motion)
 
    return wrapper
 
class DraggableWindow:
    @draggable
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("400x300")
 
        # 添加控件
        self.add_widgets()
 
    def add_widgets(self):
        button = tk.Button(self.root, text="按鈕")
        button.pack(pady=20)
 
        label = tk.Label(self.root, text="移動窗口")
        label.pack(pady=20)
 
    def run(self):
        self.root.mainloop()
 
# 啟動窗口
app = DraggableWindow()
app.run()

上面代碼中,draggable 裝飾器應(yīng)用到類的 __init__ 方法上,這樣在類實例化時,窗口會自動綁定拖動事件。

裝飾器內(nèi)部通過 self.root.bind 綁定拖動功能。

這樣封裝后,拖動功能的邏輯被封裝在裝飾器中,類的代碼保持清晰簡潔。

三、學(xué)后總結(jié)

1. 未來在編程中,常用的功能貌似都可以包裝成一個裝飾器或者一個可以調(diào)用的模塊的形式,這樣實現(xiàn)主程序和一些功能性的組件分離,修改、調(diào)試程序就更加方便。

2. 今天的學(xué)習(xí)中,從單個的函數(shù)實現(xiàn),到簡單的裝飾器以及類裝飾器的實現(xiàn),復(fù)雜程度進(jìn)一步提升,應(yīng)用的邏輯也更多加清晰。

3. 學(xué)習(xí)Python是一個認(rèn)識不斷加深的過程,像裝飾器這樣難理解的概念,如果單純從文字上理解比較困難,可以放在小項目中,逐步消化,增進(jìn)理解。

到此這篇關(guān)于如何實現(xiàn)Python編寫的圖形界面可以自由拖動的文章就介紹到這了,更多相關(guān)Python圖形界面自由拖動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Python并發(fā)編程之從性能角度來初探并發(fā)編程

    詳解Python并發(fā)編程之從性能角度來初探并發(fā)編程

    這篇文章主要介紹了詳解Python并發(fā)編程之從性能角度來初探并發(fā)編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python的tkinter、socket庫開發(fā)tcp的客戶端和服務(wù)端詳解

    python的tkinter、socket庫開發(fā)tcp的客戶端和服務(wù)端詳解

    本文介紹了TCP通訊流程和開發(fā)步驟,包括客戶端和服務(wù)端的實現(xiàn),客戶端使用Python的tkinter庫實現(xiàn)圖形化界面,服務(wù)端使用socket庫監(jiān)聽連接并處理消息,文章還提供了客戶端和服務(wù)端的代碼示例
    2025-01-01
  • django里面的forms模塊詳解

    django里面的forms模塊詳解

    這篇文章主要介紹了django里面的forms模塊詳解的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Python中全局變量和局部變量的區(qū)別以及使用

    Python中全局變量和局部變量的區(qū)別以及使用

    本文介紹了Python中的變量作用域,包括局部變量和全局變量的定義使用和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Python單元測試的9個技巧技巧

    Python單元測試的9個技巧技巧

    這篇文章主要給大家分享的是Python單元測試常見的幾個技巧,文章會講解requests的一些細(xì)節(jié)實現(xiàn)以及pytest的使用等,感興趣的小伙伴不妨和小編一起閱讀下面文章 的具體內(nèi)容吧
    2021-09-09
  • python如何利用turtle繪制正方形

    python如何利用turtle繪制正方形

    這篇文章主要介紹了python如何利用turtle繪制正方形,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 從基礎(chǔ)到高階探索Python中的文件操作

    從基礎(chǔ)到高階探索Python中的文件操作

    文件操作在Python編程中是不可或缺的一部分,在本篇博客中,我們將全面、深入地探討Python中的文件操作,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2023-06-06
  • python 計算t分布的雙側(cè)置信區(qū)間

    python 計算t分布的雙側(cè)置信區(qū)間

    這篇文章主要介紹了python 計算t分布的雙側(cè)置信區(qū)間,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python模擬自動存取款機(jī)的查詢、存取款、修改密碼等操作

    Python模擬自動存取款機(jī)的查詢、存取款、修改密碼等操作

    這篇文章主要介紹了Python模擬自動存取款機(jī)的查詢、存取款、修改密碼等操作,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Python數(shù)據(jù)類型探索列表魔法世界

    Python數(shù)據(jù)類型探索列表魔法世界

    這篇文章主要為大家介紹了Python數(shù)據(jù)類型探索列表魔法世界,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論

中超| 靖安县| 临城县| 甘谷县| 武宁县| 武穴市| 河北区| 泗水县| 成都市| 邹平县| 嘉定区| 平潭县| 凌海市| 清丰县| 会泽县| 迭部县| 永州市| 芒康县| 额尔古纳市| 凤台县| 柘荣县| 江孜县| 枝江市| 洛阳市| 徐水县| 潼南县| 博湖县| 百色市| 榆林市| 石门县| 灯塔市| 西乌珠穆沁旗| 确山县| 苏尼特左旗| 社旗县| 崇左市| 栾城县| 南漳县| 芒康县| 高唐县| 筠连县|