python - Python Tkinter 如何在 txt 文档中编辑脚本的变量?
问题描述
我试图弄清楚如何打开一个包含脚本的 txt 文件并编辑if not testfolder.filter
txt 文件中循环内的所有变量。我使用 tkinter 作为 GUI,我有一些输入字段,我想用它们来替换这些变量并在按下名为Add Alert的按钮后保存 txt 文件
我要更新的script.txt :
from exchangelib import Credentials, Account, UTC_NOW, EWSTimeZone, EWSDateTime, EWSDate, Q
from collections import defaultdict
from datetime import timedelta, datetime
from kayako import KayakoAPI
from kayako import Department, TicketCount, TicketStatus, TicketPriority, TicketType, TicketNote, TicketAttachment, Ticket
#Kayako RESTAPI forbindelse
API_URL = 'https://hidden.com/api/index.php'
API_KEY = 'hidden'
SECRET_KEY = 'hidden'
api = KayakoAPI(API_URL, API_KEY, SECRET_KEY)
credentials = Credentials('hidden@hidden.com', 'hidden')
a = Account('hidden@hidden.com', credentials=credentials, autodiscover=True)
testfolder = a.public_folders_root / 'Hidden' / 'status@hidden.com'
since = UTC_NOW() - timedelta(hours=24)
high = api.first(TicketPriority, title="High")
openTicket = api.first(TicketStatus, title="Open")
task = api.first(TicketType, title="Task")
departmentid = 5
if not testfolder.filter(subject__icontains=Subj, datetime_received__gt=since, sender=EmailAdr).exists():
ticket = api.create(Ticket, tickettypeid=task.id, ticketstatusid=openTicket.id, ticketpriorityid=high.id, departmentid=departmentid, userid="unassigned")
ticket.subject = TicketSubj
ticket.fullname = TicketName
ticket.email = TicketEmail
ticket.contents = TicketBody
ticket.add()
print('Log mangler! Opretter kayako ticket....')
else:
print('Log er fundet.')
我的 tkinter .py 脚本
from tkinter import *
root = Tk()
Timer = 0
timer1 = int(Timer)
EmailAdr = StringVar()
Subj = StringVar()
TicketSubj = StringVar()
TicketName = StringVar()
TicketEmail = StringVar()
TicketBody = StringVar()
root.geometry("400x250")
e1 = Entry(root, textvariable=Subj)
e1.grid()
e2 = Entry(root, textvariable=EmailAdr)
e2.grid()
e3 = Entry(root)
e3.grid()
e4 = Entry(root, textvariable=TicketSubj)
e4.grid()
e5 = Entry(root, textvariable=TicketName)
e5.grid()
e6 = Entry(root, textvariable=TicketEmail)
e6.grid()
e7 = Entry(root, textvariable=TicketBody)
e7.grid()
def func1():
global Subj
Subj = e1.get()
def func2():
global EmailAdr
EmailAdr = e2.get()
def func3():
global Timer
Timer = e3.get()
def func4():
global TicketSubj
TicketSubj = e4.get()
def func5():
global TicketName
TicketName = e5.get()
def func6():
global TicketEmail
TicketEmail = e6.get()
def func7():
global TicketBody
TicketBody = e7.get()
def demAlle():
func1()
func2()
func3()
func4()
func5()
func6()
func7()
aButton = Button(root, text="Add Alert", command=demAlle)
aButton.grid()
root.mainloop()
解决方案
您不需要将条目与变量相关联。如果您只是在没有必要时阅读它们。我还添加了一个带有标签的列,以查看我正在使用的字段。
您可以通过多种方式进行替换,具体取决于“script.txt”的变化方式。我假设它可能会改变并首先找到 if 语句的第一行。
假设 if 语句和以下行将始终保持相同的顺序,我将根据条目替换字段,但前提是在条目中输入了某些内容。
在处理文件时,我首先将其读入行列表,因为这很容易使用。处理后,我用替换编写文件(但名称为“new_script.txt”。我假设您使用 Utf-8 编码,否则将其更改为您的首选编码。
from tkinter import *
root = Tk()
root.geometry("400x250")
Label(root, text='Subj:').grid(row=0, column=0, sticky='w')
Subj_entry = Entry(root)
Subj_entry.grid(row=0, column=1)
Label(root, text='EmailAdr:').grid(row=1, column=0, sticky='w')
EmailAdr_entry = Entry(root)
EmailAdr_entry.grid(row=1, column=1)
Label(root, text='TicketSubj:').grid(row=3, column=0, sticky='w')
TicketSubj_entry = Entry(root)
TicketSubj_entry.grid(row=3, column=1)
Label(root, text='TicketName:').grid(row=4, column=0, sticky='w')
TicketName_entry = Entry(root)
TicketName_entry.grid(row=4, column=1)
Label(root, text='TicketEmail:').grid(row=5, column=0, sticky='w')
TicketEmail_entry = Entry(root)
TicketEmail_entry.grid(row=5, column=1)
Label(root, text='TicketBody:').grid(row=6, column=0, sticky='w')
TicketBody_entry = Entry(root)
TicketBody_entry.grid(row=6, column=1)
def demAlle():
# Read from Entries
Subj = Subj_entry.get()
EmailAdr = EmailAdr_entry.get()
TicketSubj = TicketSubj_entry.get()
TicketName = TicketName_entry.get()
TicketEmail = TicketEmail_entry.get()
TicketBody = TicketBody_entry.get()
# Read file into a list of rows which is easy to work with
with open('script.txt', encoding='utf-8') as script:
rows = script.readlines()
# Find the place where you want to alter the code
for index, row in enumerate(rows):
if row.startswith('if not testfolder.'):
break
# Altering lines; this can be done in many ways...
if Subj != '': # Check if field is empty
rows[index] = rows[index].replace('Subj', Subj)
if EmailAdr != '':
rows[index] = rows[index].replace('EmailAdr', EmailAdr)
if TicketSubj != '':
rows[index+2] = rows[index+2][:21] + TicketSubj + '\n'
if TicketName != '':
rows[index+3] = rows[index+3][:22] + TicketName + '\n'
if TicketEmail != '':
rows[index+4] = rows[index+4][:19] + TicketEmail + '\n'
if TicketBody != '':
rows[index+5] = rows[index+5][:22] + TicketBody + '\n'
# Open file and write the new contents
with open('new_script.txt', 'w', encoding='utf-8') as script:
for row in rows:
script.write(row)
aButton = Button(root, text="Add Alert", command=demAlle)
aButton.grid()
root.mainloop()
推荐阅读
- cassandra - 使用 Cassandra 表作为键值对的正确做法是什么。并对该表执行批量读写
- javascript - Highcharts 图例显示异常管道
- php - 多个相邻结果对的总和
- scala - 从枚举scala对象访问值不起作用
- reactjs - 不同页面主页上图标处理程序的颜色
- android - 为什么我的平板电脑与我在 google play 上的应用不兼容
- django - ModuleNotFoundError:没有名为“capfuzz”的模块
- c++ - 有没有一种方法可以忽略 Qt c++ 中的文件名大小写敏感性?
- python - keras/tensorflow 模型:梯度 wrt 输入为所有输入数据返回相同(错误?)值
- mysql - 重命名 Windows 服务器会影响在该服务器上运行的 mysql 实例吗