【Python】图形用户界面设计

1、设计并编写一个窗口程序,该窗口只有一个按钮,当用户单击时可在后台输出hello

world.

import tkinter as tk
def on_button_click():
    print("hello world")
# 创建主窗口
root = tk.Tk()
root.title("Hello World Button")
# 设置窗口大小
root.geometry("200x100")
# 创建一个按钮
button = tk.Button(root, text="点击", command=on_button_click)
# 将按钮添加到主窗口
button.pack(pady=20)
# 启动主事件循环
root.mainloop()

2、设计并编写一个窗口程序,该窗口中的第一,第二行都是一个文本框,用于输人账号和密码,第三行是一个“提交"按钮。要求:密码框输人时不显示明文(设置wxTEPASSWORD属性),当用户单击提交时检测账号和密码是否都是admin,如果正确则在后台输出登录成功,否则输出登录失败。

这个要安装wxpython

pip install wxPython

或者在 wxPython · PyPI中下载对应版本的,放入Scripts中,再

python -m pip install wxPython-4.2.1-cp38-cp38-win_amd64.whl#下载的文件名
import wx
class LoginDialog(wx.Dialog):
    def __init__(self, parent, title):
        super(LoginDialog, self).__init__(parent, title=title, size=(300, 150))

        # 创建账号和密码的文本框
        self.username_ctrl = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
        self.password_ctrl = wx.TextCtrl(self, style=wx.TE_PASSWORD | wx.TE_PROCESS_ENTER)

        # 创建提交按钮
        self.submit_btn = wx.Button(self, label="提交")
        self.submit_btn.Bind(wx.EVT_BUTTON, self.on_submit)

        # 布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(wx.StaticText(self, label="账号:"), 0, wx.ALIGN_CENTER | wx.ALL, 5)
        sizer.Add(self.username_ctrl, 0, wx.EXPAND | wx.ALL, 5)
        sizer.Add(wx.StaticText(self, label="密码:"), 0, wx.ALIGN_CENTER | wx.ALL, 5)
        sizer.Add(self.password_ctrl, 0, wx.EXPAND | wx.ALL, 5)
        sizer.Add(self.submit_btn, 0, wx.ALIGN_CENTER | wx.ALL, 5)

        self.SetSizerAndFit(sizer)

    def on_submit(self, event):
        username = self.username_ctrl.GetValue()
        password = self.password_ctrl.GetValue()

        if username == "admin" and password == "admin":
            print("登录成功")
        else:
            print("登录失败")

        # 应用程序的主类


class MyApp(wx.App):
    def OnInit(self):
        dialog = LoginDialog(None, title="登录窗口")
        dialog.ShowModal()
        dialog.Destroy()
        return True

    # 运行应用程序


if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()

3.使用wx.html2或其他网页控件设计并编写一个基本浏览器。功能包括后退、前进、刷新、网址输人框、网页显示。

import wx  
import wx.html2 as webview  
  
class BrowserFrame(wx.Frame):  
    def __init__(self, title):  
        super().__init__(None, title=title, size=(800, 600))  
  
        # 创建面板和布局  
        panel = wx.Panel(self)  
        sizer = wx.BoxSizer(wx.VERTICAL)  
  
        # 创建网址输入框  
        self.url_ctrl = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)  
        sizer.Add(self.url_ctrl, 0, wx.EXPAND | wx.ALL, 5)  
  
        # 创建WebView控件  
        self.browser = webview.WebView.New(panel)  
        sizer.Add(self.browser, 1, wx.EXPAND | wx.ALL, 5)  
  
        # 创建工具栏按钮  
        toolbar = self.CreateToolBar()  
        back_btn = toolbar.AddTool(wx.ID_BACKWARD, 'Back', wx.Bitmap('back.png'))  # 你需要提供'back.png'图片  
        forward_btn = toolbar.AddTool(wx.ID_FORWARD, 'Forward', wx.Bitmap('forward.png'))  # 你需要提供'forward.png'图片  
        refresh_btn = toolbar.AddTool(wx.ID_REFRESH, 'Refresh', wx.Bitmap('refresh.png'))  # 你需要提供'refresh.png'图片  
        toolbar.Realize()  
  
        # 绑定按钮事件  
        self.Bind(wx.EVT_TOOL, self.OnBackward, id=wx.ID_BACKWARD)  
        self.Bind(wx.EVT_TOOL, self.OnForward, id=wx.ID_FORWARD)  
        self.Bind(wx.EVT_TOOL, self.OnRefresh, id=wx.ID_REFRESH)  
        self.Bind(wx.EVT_TEXT_ENTER, self.OnURLEnter, self.url_ctrl)  
  
        # 设置面板布局  
        panel.SetSizer(sizer)  
  
        # 加载初始页面(可选)  
        self.LoadPage('http://www.example.com')  
  
    def LoadPage(self, url):  
        self.browser.LoadURL(url)  
  
    def OnBackward(self, event):  
        if self.browser.CanGoBack():  
            self.browser.GoBack()  
  
    def OnForward(self, event):  
        if self.browser.CanGoForward():  
            self.browser.GoForward()  
  
    def OnRefresh(self, event):  
        self.browser.Reload()  
  
    def OnURLEnter(self, event):  
        url = self.url_ctrl.GetValue()  
        self.LoadPage(url)  
  
if __name__ == '__main__':  
    app = wx.App(False)  
    frame = BrowserFrame('Simple Browser')  
    frame.Show()  
    app.MainLoop()

 

4、使用 StyledTextCtr|控件编写一个Python编辑器,功能包括打开、保存、Python 代码颜色渲染(wxPython Demo 中的 advanced Generic Widgets 里的 RulerCtrl中有)。


import wx
import wx.stc as stc
import os


class PythonEditorFrame(wx.Frame):
    def __init__(self, parent=None, title='Python Editor'):
        super(PythonEditorFrame, self).__init__(parent, title=title, size=(800, 600))


        # 创建StyledTextCtrl
        self.text_ctrl = stc.StyledTextCtrl(self, style=wx.TE_MULTILINE)
        # 设置lexer
        self.text_ctrl.SetLexer(stc.STC_LEX_NULL)

        # 设置样式
        self.text_ctrl.StyleSetSpec(stc.STC_STYLE_DEFAULT, "fore:#000000,back:#FFFFFF,face:Courier New,size:10")
        self.text_ctrl.StyleSetSpec(1, "fore:#FF0000")  # 假设1是关键字的样式ID

        # 'def'和'class'关键字设置红色
        self.text_ctrl.SetText("def function():\n\tprint('Hello, World!')\n\nclass MyClass:\n\tpass")
        self.text_ctrl.StartStyling(0)
        self.text_ctrl.SetStyling(3, 1)  # 将'def'设置为红色(样式ID 1)
        self.text_ctrl.SetStyling(19, 1)  # 将'class'设置为红色(样式ID 1)
        # 创建一个简单的菜单(文件 -> 打开/保存)
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        open_item = fileMenu.Append(wx.ID_OPEN, '&Open', 'Open a file')
        self.Bind(wx.EVT_MENU, self.OnOpen, open_item)
        save_item = fileMenu.Append(wx.ID_SAVE, '&Save', 'Save the file')
        self.Bind(wx.EVT_MENU, self.OnSave, save_item)
        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)

        # 布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text_ctrl, 1, wx.EXPAND | wx.ALL, 5)
        self.SetSizer(sizer)

    def OnOpen(self, event):
        """打开文件对话框,并读取文件内容到StyledTextCtrl"""
        with wx.FileDialog(self, "Open Python file", "", "",
                           "Python files (*.py)|*.py", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return  # 用户取消了操作

            # 读取文件内容
            pathname = fileDialog.GetPath()
            try:
                with open(pathname, 'r') as file:
                    self.text_ctrl.SetText(file.read())
            except IOError:
                wx.LogError("Unable to open file '%s'" % pathname)

    def OnSave(self, event):
        """保存StyledTextCtrl的内容到文件"""
        with wx.FileDialog(self, "Save Python file", "", "",
                           "Python files (*.py)|*.py", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return  # 用户取消了操作

            # 保存文件内容
            pathname = fileDialog.GetPath()
            try:
                with open(pathname, 'w') as file:
                    file.write(self.text_ctrl.GetText())
            except IOError:
                wx.LogError("Unable to save file '%s'" % pathname)


if __name__ == '__main__':
    app = wx.App(False)
    frame = PythonEditorFrame()
    frame.Show()
    app.MainLoop()

5、设计并编写一个简单的计算器程序,功能包括:0~9的数字按键、运算符“十”“-”“*”“/”、=(等号)与C清空按键,以及一个结果显示屏。 


import tkinter as tk


# 创建一个简单的表达式求值函数
def evaluate_expression(expression):
    try:
        return str(eval(expression))
    except Exception as e:
        return "错误: " + str(e)

    # 创建一个计算器类


class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("简单计算器")

        # 结果显示屏
        self.display = tk.Entry(master, font=('helvetica', 24), width=20, justify='right')
        self.display.grid(row=0, column=0, columnspan=4, pady=10)

        # 数字按键
        for row in range(1, 4):
            for col in range(4):
                num = str((row - 1) * 3 + col + 1)
                button = tk.Button(master, text=num, command=lambda num=num: self.append_to_display(num))
                button.grid(row=row, column=col, padx=10, pady=10)

                # 运算符按键
        ops = ['+', '-', '*', '/']
        for col, op in enumerate(ops, start=4):
            button = tk.Button(master, text=op, command=lambda op=op: self.append_to_display(op))
            button.grid(row=1, column=col, padx=10, pady=10)

            # 等号按键
        equal_button = tk.Button(master, text='=', command=self.calculate)
        equal_button.grid(row=4, column=3, padx=10, pady=10)

        # 清空按键
        clear_button = tk.Button(master, text='C', command=self.clear_display)
        clear_button.grid(row=4, column=2, padx=10, pady=10)

    def append_to_display(self, text):
        self.display.insert(tk.END, text)

    def clear_display(self):
        self.display.delete(0, tk.END)

    def calculate(self):
        try:
            expression = self.display.get()
            result = evaluate_expression(expression)
            self.display.delete(0, tk.END)
            self.display.insert(tk.END, result)
        except Exception as e:
            self.display.delete(0, tk.END)
            self.display.insert(tk.END, "错误: " + str(e))

        # 创建主窗口并运行计算器


root = tk.Tk()
calc = Calculator(root)
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/631251.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue的学习 —— <网络请求库Axios>

目录 前言 正文 一、Axios基本概念 二、安装Axios 三、Axios使用方法 四、向服务器发送请求 前言 在之前的开发案例中,我们通常直接在组件中定义数据。但在实际的项目开发中,我们需要从服务器获取数据。当其他用户希望访问我们自己编写的网页时&a…

区块链数据集(一)Xblock

一、Transaction Datasets Ethereum On-chain Data [Dataset] 2021-10TransactionData/Code AvailableEthereum Introduction: This is the dataset of paper “XBlock-ETH: Extracting and Exploring Blockchain Data From Ethereum”. Data / Code Paper CiteDownloads: …

vue3 自定义组件

在项目中,我们会遇到一些没有现成的组件,那这个时候我们就需要自己去写一个满足我们需求的组件。 比如,我需要一个上下排布,上面显示标题,下面显示内容的组件。封装完成后方便复用。 1、布局组件 我定义一个上下结构的…

meshlab: pymeshlab沿着椭圆赤道投影展开当前网格的几何图形并保存(geometric cylindrical unwrapping)

一、关于环境 请参考:pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考,禁止转载和引用,仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

51单片机入门:I2C通讯协议

I2C通讯协议 I2C简介 串口通信只能在两个设备之间进行,如果是三个设备相互通讯,那么每个设备需要两组串口,实际上是3组相互独立的串口通信。如果是4个设备相互通信就更加麻烦了,最突出的问题就是线路连接比较复杂。 为了解决这个…

现代加密技术(对称和非对称加密)

1.分类 现代加密技术:对称和非对称加密,对称加密即共享密钥,非对称加密是公钥加密算法。 2.基础总结 AES是什么算法? 分组加密算法,对称加密算法AES的分组长度是?固定128位AES密钥长度是多少?支…

Shell编程之数组

一.数组定义方法 1.数组名称(数值1 数值2 数值3 数值4 数值5)数组名称("字符串1" "字符串2" "字符串4" "字符串5" "字符串6")(或者使用单引号) 如何查看数组的元素&#xff1…

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件 介绍 ProGuard是一个纯java编写的混淆工具,有客户端跟jar包两种使用方式。可以将程序打包为jar,然后用工具进行混淆,也可以在maven中导入ProGuard的插件,对代码进行混淆。 大家都知道 java代…

ADS Momentum 仿真设置

1、选择Momenttum Microwave。 2、Layout不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建叠层,过孔可以在叠层中右键添加。 5、注意确认端口的Gnd Layer。 6、设置仿真频率。 7、Output Plan。 8、Option。 最后运行仿真,等待结果即…

C++ static_cast学习

static_cast可实现, 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时,会损失精度类似于C语言的强制转化; 下面先看一下void指针的转换; …

49-Qt控件详解:ltemViewsltemWidgets

1.List View:清单视图 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QListView> //字符串列表模型 #include <QStringListModel> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…

如何在Sui智能合约中验证是否为多签地址

通过多签合约实现多个用户可访问的安全账户。多签&#xff08;multi-sig&#xff09;钱包和账户通过允许多个用户在预定义条件下访问共享资产&#xff0c;或让单个用户实施额外的安全措施&#xff0c;从而增强密钥管理。例如&#xff0c;多签钱包可以用于管理去中心化自治组织&…

码农慎入 | 入坑软路由,退烧IDC,Homelab折腾记

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 俗话说&#xff0c;入门软路由&#xff0c;退坑IDC 这一期&#xff0c;我们将深入探讨一个许多科技爱好者…

【介绍下JSON,JSON是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Folder Icons for Mac v1.9激活版:自定义文件夹图标

在追求个性和品味的今天&#xff0c;Folder Icons for Mac 让您的Mac桌面焕然一新。支持多种格式的图片和图标文件&#xff0c;满足您不同的审美需求。同时&#xff0c;软件提供丰富的图标库和模板&#xff0c;让您在定制文件夹图标时更加得心应手。Folder Icons for Mac 不仅能…

【React】如何让函数式组件也能使用state——useState(Hooks)

React的函数式组件不同于类式组件&#xff0c;函数式组件没有自己的 this&#xff0c;看似没有操作state的能力 但是React官方提供了一个Hooks叫useState&#xff0c;它解决了函数式组件和类式组件的差异&#xff0c;让函数式组件拥有了类式组件所拥有的 state &#xff0c;同时…

Golang | Leetcode Golang题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; func reverseBetween(head *ListNode, left, right int) *ListNode {// 设置 dummyNode 是这一类问题的一般做法dummyNode : &ListNode{Val: -1}dummyNode.Next headpre : dummyNodefor i : 0; i < left-1; i {pre pre.Next}cur :…

vue2人力资源项目9权限管理

页面搭建 <template><div class"container"><div class"app-container"><el-button size"mini" type"primary">添加权限</el-button><el-table-column label"名称" /><el-table-co…

DS高阶:跳表

一、skiplist 1.1 skiplist的概念 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为key或者key/value的查找模型。skiplist是由William Pugh发明的&#xff0c;最早出现于他在1990年发…

商品服务:SPUSKU规格参数销售属性

1.Object划分 1.PO&#xff08;Persistant Object&#xff09;持久对象 PO就是对应数据库中某个表中的一条记录&#xff0c;多个记录可以用PO的集合。PO中应该不报含任何对数据库的操作 2.DO(Domain Object) 领域对象 就是从现实世界中抽象出来的有形或无形的业务实体。 3…