python 导航栏

37 篇文章 1 订阅
21 篇文章 0 订阅
# -*- coding: utf-8 -*-#

#-------------------------------------------------------------------------------
# Name:         导航条控件
#-------------------------------------------------------------------------------

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class NavigationWidget(QWidget):
    currentItemChanged = pyqtSignal([int, str])
    def __init__(self, parent=None):
        super(NavigationWidget, self).__init__(parent)

        self.initUI()

    def initUI(self):
        self.backgroundColor = '#E4E4E4'
        self.selectedColor = '#2CA7F8'
        self.rowHeight = 40
        self.currentIndex = 0 #当前选择的项索引
        self.listItems = []
        self.cursorIndex = -1 #当前光标所在位置的项索引

        self.setMouseTracking(True)
        self.setMinimumWidth(120)

    def addItem(self, item):
        self.listItems.append(item)
        self.update()

    def setItems(self, items):
        self.listItems = items
        self.update()

    def setBackgroundColor(self, color):
        self.backgroundColor = color
        self.update()

    def setSelectColor(self, color):
        self.selectedColor = color
        self.update()

    def setRowHeight(self, height):
        self.rowHeight = height
        self.update()

    def setCurrentIndex(self, idx):
        self.currentIndex = idx
        self.currentItemChanged.emit(idx, self.listItems[idx])
        self.update()

    def paintEvent(self, evt):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing, True)

        #画背景色
        painter.setPen(Qt.NoPen)
        painter.setBrush(QColor(self.backgroundColor))
        painter.drawRect(self.rect())

        #画子项
        for i in range(len(self.listItems)):
            itemPath = QPainterPath()
            itemPath.addRect(QRectF(0, i*self.rowHeight, self.width()-1, self.rowHeight-1))

            if i == self.currentIndex:
                painter.setPen(QColor('#FFFFFF'))
                painter.fillPath(itemPath, QColor(self.selectedColor))
            elif i == self.cursorIndex:
                painter.setPen(QColor('#FFFFFF'))
                painter.fillPath(itemPath, QColor(self.selectedColor))
            else:
                painter.setPen(QColor('#202020'))
                painter.fillPath(itemPath, QColor(self.backgroundColor))

            painter.drawText(QRect(0, i*self.rowHeight, self.width(), self.rowHeight), Qt.AlignVCenter|Qt.AlignHCenter, self.listItems[i])

    def mouseMoveEvent(self, evt):
        idx = evt.y() / self.rowHeight
        if idx >= len(self.listItems):
            idx = -1
        if idx < len(self.listItems) and idx != self.cursorIndex:
            self.update()
            self.cursorIndex = idx

    def mousePressEvent(self, evt):
        idx = evt.y()/self.rowHeight
        if  idx< len(self.listItems):
            self.currentIndex = idx
            self.currentItemChanged.emit(idx, self.listItems[idx])
            self.update()

    def leaveEvent(self, QEvent):
        self.cursorIndex = -1
        self.update()


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUI()

    def initUI(self):
        self.resize(600, 400)
        self.setWindowTitle(u'导航条控件')

        mainWidget = QWidget()
        self.setCentralWidget(mainWidget)

        navigationWidget = NavigationWidget()
        navigationWidget.setRowHeight(50)
        navigationWidget.setItems([u'常规', u'高级', u'管理', u'其它', u'关于'])

        self.tipsLabel = QLabel(u"请选择:")

        mainLayout = QHBoxLayout(mainWidget)
        mainLayout.setContentsMargins(0, 0, 0, 0)
        
        mainLayout.setSpacing(10)
        mainLayout.addWidget(navigationWidget, 1)
        mainLayout.addWidget(self.tipsLabel, 3, Qt.AlignCenter)

        navigationWidget.currentItemChanged[int, str].connect(self.slotCurrentItemChanged)
        navigationWidget.setCurrentIndex(2)

        self.show()

    def slotCurrentItemChanged(self, index, content):
        self.tipsLabel.setText(u"Current index and content:{} ---- {}".format(index, content))

def main():
    app = QApplication(sys.argv)
    mainWnd = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

在这里插入图片描述

Python中,可以使用不同的GUI库来创建导航栏和页面切换效果,我们以Tkinter为例来演示如何实现导航栏和页面切换的功能。 首先,需要导入Tkinter库: ```python import tkinter as tk ``` 然后,创建一个窗体对象: ```python window = tk.Tk() ``` 接下来,创建一个导航栏,可以使用Tkinter的Button组件来实现: ```python def change_page(page): page_label.config(text=page) nav_bar = tk.Frame(window) nav_bar.pack() button1 = tk.Button(nav_bar, text="Page 1", command=lambda: change_page("Page 1")) button1.pack(side=tk.LEFT) button2 = tk.Button(nav_bar, text="Page 2", command=lambda: change_page("Page 2")) button2.pack(side=tk.LEFT) button3 = tk.Button(nav_bar, text="Page 3", command=lambda: change_page("Page 3")) button3.pack(side=tk.LEFT) ``` 在上述代码中,我们创建了一个`change_page()`函数来根据点击的按钮来改变页面的内容,这里仅仅是将页面名称更新到一个Label组件中。 然后,我们使用`pack()`方法将导航栏按钮放置在窗体的顶部。 接下来,创建一个用于显示页面的Label组件: ```python page_label = tk.Label(window, text="Page 1") page_label.pack() ``` 最后,使用`window.mainloop()`启动程序的主循环。 完整的示例代码如下: ```python import tkinter as tk def change_page(page): page_label.config(text=page) window = tk.Tk() nav_bar = tk.Frame(window) nav_bar.pack() button1 = tk.Button(nav_bar, text="Page 1", command=lambda: change_page("Page 1")) button1.pack(side=tk.LEFT) button2 = tk.Button(nav_bar, text="Page 2", command=lambda: change_page("Page 2")) button2.pack(side=tk.LEFT) button3 = tk.Button(nav_bar, text="Page 3", command=lambda: change_page("Page 3")) button3.pack(side=tk.LEFT) page_label = tk.Label(window, text="Page 1") page_label.pack() window.mainloop() ``` 在上述代码中,点击导航栏上的不同按钮,页面的内容会随之改变,即Label组件中显示的内容会更新为对应的页面名称。你可以根据实际需求,将页面的内容替换为其他组件或布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐倉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值