我使用kivy创建了一个mailmerge应用程序,用于用户界面,并使用python作为后端编码语言。
该应用程序包含带有按钮的主屏幕。按下按钮会触发一个fileopen对话框,用户可以在其中选择所需的文件。所需文件是带有一些文本和占位符(合并字段)的Word文档。
选择文件后,将打开一个弹出窗口以显示:
动态创建的标签(显示合并在word文档中创建的字段名称)
动态创建的空白TextInput小部件(用户需要输入必须在文档中填充的数据)
2个按钮(“保存”按钮-将文件保存在指定位置;“另存为”按钮-用户可以选择所需位置)。
按下保存按钮时,用户在TextInput字段中输入的数据将填充到文档中,并将其另存为指定位置的默认新文件。
按下saveAs按钮时,用户在TextInput字段中输入的数据将填充到文档中,并触发一个saveAs对话框,用户可以在其中选择要保存新文件的位置。
我面临的问题是,在按保存按钮时,用户在TextInput小部件中输入的数据仅填充一次到新文档中,当TextInput中的数据更改并按Save时没有任何作用。再按一次。该应用程序必须重新启动才能使更改生效,这是不可取的。请帮我解决这个问题。
我的代码: main.py
import tkinter as tk
from tkinter import filedialog
from kivy.app import App
from kivy.base import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from docx import *
from mailmerge import MailMerge
from datetime import date
from collections import OrderedDict
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.scrollview import ScrollView
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.textinput import TextInput
import os
f_path = None
merge_data = None
merge_objects = None
merge_doc = None
class doc_select(BoxLayout):
def create_merge(self):
global f_path, merge_data, merge_doc, merge_objects
root = tk.Tk()
root.withdraw()
f_path = filedialog.askopenfilename()
merge_doc = MailMerge(f_path)
merge_fields = merge_doc.get_merge_fields()
merge_data = dict.fromkeys(merge_fields)
merge_objects = dict.fromkeys(merge_fields)
self.show_popup()
def show_popup(self):
pop = Popup(title= 'Input Details',
content = popup_content(),
size_hint = (None,None),
size = (Window.width,Window.height))
pop.open()
class popup_content(BoxLayout):
data_inputs = []
def __init__(self, **kwargs):
super().__init__(**kwargs)
def dynamic_widgets(self):
for wid in merge_objects.keys():
self.ids.Mybox.add_widget(Label(text = wid, size_hint_y=None))
merge_objects[wid] = TextInput(size_hint_y = None)
self.ids.Mybox.add_widget(merge_objects[wid])
def create_merge_data(self):
for i in merge_objects.keys():
merge_data[i] = merge_objects[i].text
def save_func(self):
save_path = 'C:/Users/pavan m sunder/tutorials/Kivy/py/docx/populated_doc.docx'
self.create_merge_data()
print(merge_data)
merge_doc.merge_templates([merge_data],separator='page_break')
merge_doc.write(save_path)
os.startfile(save_path)
def saveas_func(self):
self.create_merge_data()
print(merge_data)
merge_doc.merge_templates([merge_data],separator='page_break')
merge_doc.write(filedialog.asksaveasfilename(defaultextension='.docx',
filetypes=(('Text files', '*.txt'),
('doc files', '*.doc* .docx'),
('Python files', '*.py *.pyw'),
('All files', '*.*'))))
class docsy(App):
def build(self):
return Builder.load_file('C:/Users/pavan m sunder/tutorials/Kivy/py/docx/sample.kv')
if __name__ == '__main__':
docsy().run()
sample.kv
doc_select:
Button:
text: 'Open'
on_press: root.create_merge()
<popup_content>:
orientation: 'vertical'
ScrollView:
GridLayout:
cols:2
id: Mybox
orientation: 'vertical'
size_hint: 1, self.minimum_height
on_kv_post: root.dynamic_widgets()
GridLayout:
size_hint: 1, 0.1
cols: 2
Button:
text: 'Save'
on_press: root.save_func()
Button:
text: 'SaveAs'
on_press: root.saveas_func()
wordfile内容:sample.docx
欢迎«名称»! “日期” 您好«名称»。这是使用python进行的单词编辑。 继续释放您的python技能。 «希望»!