python:tkinterweb 简单又好用的 htmlview 组件

这篇具有很好参考价值的文章主要介绍了python:tkinterweb 简单又好用的 htmlview 组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

tkinterweb  是简单又好用的 webview 组件,也可用来显示本地 html文件。

pip install tkinterweb ;

pip install readmdict ; 参见: 使用Python调用mdx字典文件进行查词

安装 MDict 去 MDict | One app for all dictionaries 下载

测试 html view 程序 tk_read_mdict.py 如下:

# -*- coding: utf-8 -*-
""" 查询英汉词典 """
import os
import time
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinterweb import HtmlFrame
import pygame
from readmdict import MDX  # pip install readmdict
import win32com.client  # TTS
sapi = win32com.client.Dispatch("SAPI.SpVoice")

#pygame.init()
pygame.mixer.init()

os.chdir("/MDictPC/doc")

def speak():
    """ TTS发音 """
    txt = frame.get_currently_selected_text()
    if txt == None:
        txt = entry.get()
    if txt.strip() !='':
        sapi.Speak(txt)

def mplay(filename):
    """播放.mp3 """
    if pygame.mixer.music.get_busy():
        print("mixer.music.get_busy")
        return 1
    if not os.path.exists(filename):
        print(f"{filename} not found.")
        return 2
    fn,ext = os.path.splitext(filename)
    if ext.lower() == '.mp3':
        pygame.mixer.music.load(filename)
        pygame.mixer.music.play()
    else:
        print(f"{filename} is not .mp3")
        return 3
    return 0


def open_mdx():
    """ 读.mdx词典文件 """
    file1 = ''
    filetypes = [('mdx file','.mdx')]
    file1 = filedialog.askopenfilename(initialdir=".", filetypes=filetypes)
    if file1 == '': return
    start_time = time.time()
    path1 = os.path.dirname(file1)
    os.chdir(path1)
    global headwords, items
    # 加载.mdx文件
    fname = os.path.basename(file1)
    mdx = MDX(fname)
    headwords = [*mdx]       # 单词名列表
    items = [*mdx.items()]   # 释义html源码列表
    n = len(headwords)
    m = len(items)
    end_time = time.time()
    print('cost %f second' % (end_time - start_time))
    if n == m:
        var1.set(f'{fname} 加载成功:共{n}条')
    else:
        var1.set(f'ERROR:{fname} 加载失败 {n}!={m}')
        return

def query(self):
    """  输入英文单词,并查询 """
    if not entry.get():
        messagebox.showinfo("请先选择词典","输入单词不能为空")
        return
    txt = entry.get()
    if txt.startswith("http://") or txt.startswith("https://"):
        frame.load_url(txt)
        frame.on_link_click(sound)
    else:
        prefix(txt)
        query1(txt)

def query1(txt):
    """  查询英文单词 """
    global var1, headwords
    try:
        type(headwords)
    except NameError:
        messagebox.showinfo("提示", "请先选择词典!")
        return
    word = txt.lower().encode()
    word1 = txt.capitalize().encode() # 第1个字母变大写
    try: # 查词,返回单词和html文件
        if word in headwords:
            wordIndex = headwords.index(word)
        else:
            wordIndex = headwords.index(word1)
        word,html = items[wordIndex]
        result = html.decode()
        if result.startswith('@@@LINK='):
            w = result[8:].strip()
            result = '<a href="entry://' +w+ '">' +w+ '</a>'
        else:
            result = result.replace('<img src="','<img src="./data/')
            result = result.replace('"/thumb/','"data/thumb/')
        frame.enable_stylesheets(enabled=True)
        frame.enable_images(enabled=True)
        frame.load_html(result)
        frame.on_link_click(sound)
    except:
        var1.set(f"{txt} is not in word_list.")


def prefix(txt):
    """ 前缀匹配 """
    global var1, headwords
    try:
        type(headwords)
    except NameError:
        print('headwords is undefined.')
        return
    if len(txt) > 2:
        listbox.delete(0, tk.END)
        word = txt.strip().lower() # 字母变小写
        for hw in headwords:
            hws = hw.decode().lower()
            if hws.startswith(word):
                listbox.insert(tk.END, hw.decode())
    else:
        var1.set(f"{txt} input too short")    

def sound(url):
    """ 处理<a>链接点击事件 """
    print(url)
    if url.startswith("http://"):
        frame.load_url(url)
        frame.on_link_click(sound)
    elif url.startswith("entry://"):
        query1(url[8:])
    elif url.startswith("sound://"):
        mp3file = 'data' + url[7:]
        mplay(mp3file)
    elif url.startswith('#'):
        frame.skim(url)  #anchor
    else:
        pass

def selected(self):
    """ 选择列表框 """
    try:
        index = listbox.curselection()
        txt = listbox.get(index,last=None)
        sapi.Speak(txt)
        query1(txt)
    except:
        print('listbox index is null.')

def search():
    """ 访问http://localhost:???? """
    url = entry.get()
    if url.startswith('http://'):
        frame.load_url(url)
        frame.on_link_click(sound)
        return

# main()
root = tk.Tk()
root.title("查询英汉词典")
root.geometry("1000x500")
root.resizable(width=True, height=False)
# 输入框布局
frame1 = tk.Frame(root, width=80, height=30)
frame1.pack(side="top")
entry = tk.Entry(frame1, width=50)
entry.pack(side="left", padx=5, pady=2)
entry.bind("<Return>", query) # 按下回车,执行查单词
button1 = tk.Button(frame1, text="选择词典", command=open_mdx)
button1.pack(side="left", padx=5, pady=2)
button2 = tk.Button(frame1, text="TTS读单词", command=speak)
button2.pack(side="left", padx=5, pady=2)
button3 = tk.Button(frame1, text="前缀查找", command=search)
button3.pack(side="left", padx=5, pady=2)
# 退出按钮
quit_btn = tk.Button(frame1, text="退出", fg="red", command=root.quit)
quit_btn.pack(side="right", padx=5, pady=2)
# 显示栏
var1 = tk.StringVar()
label = tk.Label(root,textvariable=var1,fg="purple", font="Song 12")
var1.set("请先选择词典")
label.pack()
# 列表框
listbox = tk.Listbox(root, width=25, font="Song 12")
listbox.bind('<<ListboxSelect>>', selected)
listbox.pack(side="left", fill='both')
#create HTML browser
frame = HtmlFrame(root, messages_enabled=False) # False:关闭debug消息
frame.pack(side="right", fill="both", expand=True, padx=5, pady=2)

root.mainloop()

可以先解压.mdd文件:python -m readmdict -x  your.mdd

运行 python tk_read_mdict.py

from tkinterweb import HtmlFrame
help(HtmlFrame)

 |  load_file(self, file_url, decode=None, force=False)
 |      Load a locally stored file from the specified path
 |
 |  load_form_data(self, url, data, method='GET', decode=None)
 |      Load a webpage using form data
 |
 |  load_html(self, html_source, base_url=None)
 |      Reset parser and send html code to it
 |
 |  load_url(self, url, decode=None, force=False)
 |      Load a website (https:// or http://) or a file (file://) from the specified URL.
 |      We use threading here to prevent the GUI from freezing while fetching the website.

关注这一句:  frame.on_link_click(sound)

def sound(url):
    """ 处理<a>链接点击事件 """
    print(url)
    if url.startswith("http://"):
        frame.load_url(url)
        frame.on_link_click(sound)
    elif url.startswith("entry://"):
        query1(url[8:])
    elif url.startswith("sound://"):
        mp3file = 'data' + url[7:]
        mplay(mp3file)
    elif url.startswith('#'):
        frame.skim(url)  #anchor
    else:
        pass


tkinterWeb offers bindings for the Tkhtml3 widget, 可惜 Tkhtml3 不支持 javascript.文章来源地址https://www.toymoban.com/news/detail-775362.html

到了这里,关于python:tkinterweb 简单又好用的 htmlview 组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • tkinter制作一个简单计算器

            我们知道tkinter是python常用的UI框架,那么它是如何使用的呢?我们用一个简单的例子来显示它的作用,制作一个简单的计算器,如下图所示。 上图是一个计算器,我们可以看出它一共有20个键,每个按键都表示一个功能,在最上方是一个文本框用来显示数值。接下

    2024年02月11日
    浏览(56)
  • 用tkinter库制作一个简单的登录注册小程序

    目录 各种组件的布局 制作过程中的理解 制作过程中遇到的难点 解决问题的方法 tkinter库作为python的标准库之一,它的功能性十分强大,下面我将使用tkinter库制作一个简易的注册登录窗口(很难看就是了)。 一· 制作之前需要大致明白各个窗体的大致位置,登录注册嘛 自然

    2024年02月09日
    浏览(39)
  • python opencv+tkinter 使用tkinter实现交互式图像处理工具

    tkinter 基本控件与使用 我们将学习如何使用Tkinter包编写一些图形用户界面程序。Tkinter是Python的一个标准包,因此我们并不需要安装它。我们将从创建一个窗口开始,然后我们在其之上加入一些小组件,比如按钮,复选框等,并使用它们的一些属性。话不多说,让我们开始吧

    2024年02月10日
    浏览(89)
  • 【Python应用】tkinter简介

    tkinter是Python自带的GUI库。 tkinter的全称是Tk Interface。 其中Tk是开发桌面应用的GUI工具库,它是Tcl的标准GUI,而Tcl全称Tool Command Language,是一种动态编程语言,可用于桌面应用开发。关于Tk和Tcl,可以在https://www.tcl.tk/查看到更多的内容,这里不多做介绍。 Tk和Tcl并不是Python的一

    2024年02月09日
    浏览(42)
  • Python tkinter库

    Tkinter模块是Python系统自带的标准GUI库,具有一套常用的图形组件 基本组件 Button 按钮 Canvas 画布,用于绘制直线、椭圆、多边形等各种图形 Checkbutton 复选框形式的按钮 Entry 单行文本框 Frame 框架,可作为其他组件的容器,常用来对组件进行分组Label 标 签,常用来显示单行文本

    2024年02月09日
    浏览(42)
  • python tkinter显示图片教程

    今天,来给大家讲解一下python tkinter显示图片的方法 首先,我们需要导入tkinter、pillow中的两个包[pillow需要自己下载(pip install pillow)] 接着,创建窗口 然后就可以导入图片啦!!! 所有代码: 运行试试。。。  这就是运行结果(致敬XP(^^ゞ))

    2024年02月08日
    浏览(37)
  • Python GUI编程(Tkinter)

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大

    2024年02月14日
    浏览(64)
  • python图形界面教程(tkinter)

    1、图形化界面设计的基本理解 当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI),即通过鼠标对菜单、按钮等图形化元素触发指令,并从标签、对话框等图型化显示容器中获取人机对话信息。 Python自带了tkinter 模块,实质上是一种流行的面向对象

    2024年02月16日
    浏览(48)
  • python版扫雷(基于tkinter),教你学python

    扫雷是一款相对简单好玩的小游戏,对于初学某种程序语言来说(特别是python),没有用一个项目来熟练自己所学的知识是很难过的去的。本次使用python语言去写一款居于python标准库模块tkinter的扫雷游戏,供python爱好者学习。 扫雷游戏规则与思路构建 tkinter标准模块 扫雷游戏暗

    2024年02月03日
    浏览(41)
  • Python tkinter(4)输入框控件

    优秀的tkinter库还有那些控件呢?这期我们就来看看输入框吧! 先制作一个窗口,然后把输入框黏上去。 输入框可以改变它的颜色。颜色包括字体颜色( fg 或 foreground )、背景颜色( bg 或 background )、选中时的高亮颜色( selectbackground )和选中时的字体颜色( selectforegroun

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包