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

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日

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题