猫目男 2022-02-12 18:59 采纳率: 83.3%
浏览 81
已结题

Python tkinter 事件绑定问题

先来看下代码,需求注释在代码中;
代码功能及运行步骤:
1.获取word文件路径(模板)。
2.获取excel文件路径(数据维护)。
3.用excel内的数据,批量添加、替换模板中的内容来生成文件,解决冗长重复性劳动。

#库
import xlrd
import tkinter as tk
import ttkbootstrap as ttk
from docx import *
from tkinter import *
from tkinter import filedialog
from docx.shared import Pt, Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from ttkbootstrap import Style
from ttkbootstrap.constants import *

root = tk.Tk()

#窗口设置(固定位置、大小、美化)
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
ww = 450
wh = 280
x = (sw-ww) / 2
y = (sh-wh) / 2
root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
root.title("批量制作岗位卡")
root.minsize(450, 280)
root.maxsize(450, 280)
style = Style(theme='litera')
window = style.master

#打开word文件(模板)
def selectdocx():
    global filepath
    filepath = filedialog.askopenfilename(filetypes=[('docx', '*.docx')])
    filename.set(filepath)

#打开excel文件(数据维护)
def selectxls():
    global filepath1
    filepath1 = filedialog.askopenfilename(filetypes=[('xls', '*.xls')])
    filename1.set(filepath1)

filename = tk.StringVar()
filename1 = tk.StringVar()

#按钮设置
tk.Label(root, text='选择word文件(.docx)').grid(
    row=1, column=2, padx=5, pady=5, sticky="w")
tk.Entry(root, textvariable=filename).grid(row=1, column=0, padx=5, pady=5)
b1 = ttk.Button(root, text='打开文件', bootstyle=(INFO, OUTLINE),
                command=selectdocx).grid(row=1, column=1, padx=5, pady=5)
tk.Label(root, text='选择excel文件(.xls) *注意文件格式').grid(row=2,
                                                    column=2, padx=5, pady=5, sticky="w")
tk.Entry(root, textvariable=filename1).grid(row=2, column=0, padx=5, pady=5)
b2 = ttk.Button(root, text='打开文件', bootstyle=(INFO, OUTLINE),
                command=selectxls).grid(row=2, column=1, padx=5, pady=5)

'''
现状:
代码可正常运行,但运行逻辑和按钮b3存在问题;
b3 无法command 到 change_data 这个主程序,因此现在只能将 change_data 的代码放到 tkinter 代码的下方;
且让 b3 按钮暂时 command " root.quit ",这样程序选择好文件路径后,窗口消失,再运行了主程序。
(但这绝对是错误的逻辑)

需求:
纠正逻辑
将 change_data 主程序代码放到 tkinter 代码上方,且b3 按钮正确 command 到 change_data (主程序)

希望聪明善良的热心网友可以附上代码解决问题!

PS:若有闲情雅致,优化一下我的主程序,那是极好的!
'''
b3 = ttk.Button(root, text='开始运行', bootstyle=(PRIMARY, OUTLINE),
                command=root.quit).grid(row=3, column=1, padx=5, pady=5)

root.mainloop()


#主程序:
def change_data(wjbh, hh, pm, gd, zw, zlbz, lb, bz, bzgg, bzd, sl):
    bz = str(bz)
    lb = str(lb)
    bzgg = str(bzgg)
    bzd = str(bzd)
    sl = str(sl)
    pm = str(pm)

    document = Document(filepath)
    for i in document.paragraphs:
        i.text = i.text.replace('***', gd)
        i.text = i.text.replace('&&&', zw)
        i.text = i.text.replace('¥¥¥', zlbz)
        i.text = i.text.replace('#', bz)
        i.text = i.text.replace('&-&-&', bzgg)
        i.text = i.text.replace('*-*-*', bzd)
        i.text = i.text.replace('¥-¥-¥', sl)

        i.paragraph_format.line_spacing = 1.25
        i.paragraph_format.left_indent = Inches(0.15)

        head = document.sections[0].header
        for b in head.paragraphs:
            b.text = b.text.replace('@', pm)
            b.text = b.text.replace('=', hh)
        for q in b.runs:
            q.font.size = Pt(12)
            q.font.bold = True

    w = head.paragraphs[0].add_run('公司')
    w.font.bold = True
    w.font.size = Pt(14)

    e = head.paragraphs[1].add_run('操作卡')
    e.font.bold = True
    e.font.size = Pt(22)

    head.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    head.paragraphs[1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    head.paragraphs[2].alignment = WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE

    foot = document.sections[0].footer
    k = foot.paragraphs[0].add_run(wjbh)
    k.font.size = Pt(8)
    foot.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    document.save(lb + pm + gd + '#' + bz + '.docx')


excel = xlrd.open_workbook(filepath1)
table = excel.sheet_by_index(0)
nows = table.nrows

for i in range(nows):
    wjbh = table.cell(i, 0).value
    hh = table.cell(i, 1).value
    pm = table.cell(i, 2).value
    gd = table.cell(i, 3).value
    zw = table.cell(i, 4).value
    zlbz = table.cell(i, 5).value
    lb = table.cell(i, 6).value
    bz = table.cell(i, 7).value
    bzgg = table.cell(i, 8).value
    bzd = table.cell(i, 9).value
    sl = table.cell(i, 10).value

    change_data(wjbh, hh, pm, gd, zw, zlbz, lb, bz, bzgg, bzd, sl)

  • 写回答

2条回答 默认 最新

  • piaoyiren 2022-02-12 20:18
    关注

    import xlrd
    import tkinter as tk
    import ttkbootstrap as ttk
    from docx import *
    from tkinter import *
    from tkinter import filedialog
    from docx.shared import Pt, Inches
    from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
    from ttkbootstrap import Style
    from ttkbootstrap.constants import *

    root = tk.Tk()

    窗口设置(固定位置、大小、美化)

    sw = root.winfo_screenwidth()
    sh = root.winfo_screenheight()
    ww = 450
    wh = 280
    x = (sw - ww) / 2
    y = (sh - wh) / 2
    root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
    root.title("批量制作岗位卡")
    root.minsize(450, 280)
    root.maxsize(450, 280)
    style = Style(theme='litera')
    window = style.master

    主程序:

    def change_data(wjbh, hh, pm, gd, zw, zlbz, lb, bz, bzgg, bzd, sl):
    bz = str(bz)
    lb = str(lb)
    bzgg = str(bzgg)
    bzd = str(bzd)
    sl = str(sl)
    pm = str(pm)

    document = Document(filepath)
    for i in document.paragraphs:
        i.text = i.text.replace('***', gd)
        i.text = i.text.replace('&&&', zw)
        i.text = i.text.replace('¥¥¥', zlbz)
        i.text = i.text.replace('#', bz)
        i.text = i.text.replace('&-&-&', bzgg)
        i.text = i.text.replace('*-*-*', bzd)
        i.text = i.text.replace('¥-¥-¥', sl)
    
        i.paragraph_format.line_spacing = 1.25
        i.paragraph_format.left_indent = Inches(0.15)
    
        head = document.sections[0].header
        for b in head.paragraphs:
            b.text = b.text.replace('@', pm)
            b.text = b.text.replace('=', hh)
        for q in b.runs:
            q.font.size = Pt(12)
            q.font.bold = True
    
    w = head.paragraphs[0].add_run('公司')
    w.font.bold = True
    w.font.size = Pt(14)
    
    e = head.paragraphs[1].add_run('操作卡')
    e.font.bold = True
    e.font.size = Pt(22)
    
    head.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    head.paragraphs[1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    head.paragraphs[2].alignment = WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE
    
    foot = document.sections[0].footer
    k = foot.paragraphs[0].add_run(wjbh)
    k.font.size = Pt(8)
    foot.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    document.save(lb + pm + gd + '#' + bz + '.docx')
    

    def saveDoc():
    excel = xlrd.open_workbook(filepath1)
    table = excel.sheet_by_index(0)
    nows = table.nrows

    for i in range(nows):
        wjbh = table.cell(i, 0).value
        hh = table.cell(i, 1).value
        pm = table.cell(i, 2).value
        gd = table.cell(i, 3).value
        zw = table.cell(i, 4).value
        zlbz = table.cell(i, 5).value
        lb = table.cell(i, 6).value
        bz = table.cell(i, 7).value
        bzgg = table.cell(i, 8).value
        bzd = table.cell(i, 9).value
        sl = table.cell(i, 10).value
    
        change_data(wjbh, hh, pm, gd, zw, zlbz, lb, bz, bzgg, bzd, sl)
    

    打开word文件(模板)

    def selectdocx():
    global filepath
    filepath = filedialog.askopenfilename(filetypes=[('docx', '*.docx')])
    filename.set(filepath)

    打开excel文件(数据维护)

    def selectxls():
    global filepath1
    filepath1 = filedialog.askopenfilename(filetypes=[('xls', '*.xls')])
    filename1.set(filepath1)

    filename = tk.StringVar()
    filename1 = tk.StringVar()

    按钮设置

    tk.Label(root, text='选择word文件(.docx)').grid(
    row=1, column=2, padx=5, pady=5, sticky="w")
    tk.Entry(root, textvariable=filename).grid(row=1, column=0, padx=5, pady=5)
    b1 = ttk.Button(root, text='打开文件', bootstyle=(INFO, OUTLINE),
    command=selectdocx).grid(row=1, column=1, padx=5, pady=5)
    tk.Label(root, text='选择excel文件(.xls) *注意文件格式').grid(row=2,
    column=2, padx=5, pady=5, sticky="w")
    tk.Entry(root, textvariable=filename1).grid(row=2, column=0, padx=5, pady=5)
    b2 = ttk.Button(root, text='打开文件', bootstyle=(INFO, OUTLINE),
    command=selectxls).grid(row=2, column=1, padx=5, pady=5)

    '''
    现状:
    代码可正常运行,但运行逻辑和按钮b3存在问题;
    b3 无法command 到 change_data 这个主程序,因此现在只能将 change_data 的代码放到 tkinter 代码的下方;
    且让 b3 按钮暂时 command " root.quit ",这样程序选择好文件路径后,窗口消失,再运行了主程序。
    (但这绝对是错误的逻辑)
    需求:
    纠正逻辑
    将 change_data 主程序代码放到 tkinter 代码上方,且b3 按钮正确 command 到 change_data (主程序)
    希望聪明善良的热心网友可以附上代码解决问题!
    PS:若有闲情雅致,优化一下我的主程序,那是极好的!
    '''
    b3 = ttk.Button(root, text='开始运行', bootstyle=(PRIMARY, OUTLINE),
    command=saveDoc).grid(row=3, column=1, padx=5, pady=5)

    root.mainloop()

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 创建了问题 2月12日

悬赏问题

  • ¥20 XP系统的老电脑一开机就提示找不到rundll.exe,付费求解
  • ¥15 milvus查询出来的score怎么转换成0-1之间的相似性
  • ¥15 多ip服务器站群如何搭建l2tp服务器
  • ¥15 lvgl V9移植到linux开发板
  • ¥15 VB.net中在窗体中创建一个button控件来关闭窗体,但是提示错误,我该怎么办
  • ¥15 网上下载好的程序但是arduinoIDE编程报错,运行不了,哪里出错了,能具体给改一下吗
  • ¥15 Sharepoint JS开发 付费技术指导
  • ¥15 输入程序运行仿真后,烟雾值不实时检测,变成固定值
  • ¥20 数据排序,可选择排序方向
  • ¥15 修改一下代码,考虑进程到达时间不同的情况