我正在尝试使用tkinter和pysrt制作一个GUI应用程序


from tkinter import filedialog, font
from  tkinter import *
from tkinter import ttk
root = Tk()
root.geometry("300x100")
root.title("SRT")
root.resizable(False, False)
frame = Frame(root)
frame.grid(column=1, row =0)
def open():
b.destroy()
filename1 =  filedialog.askopenfilename(filetypes=[("SRT files(*.srt)", "*.srt")],initialdir = "/", title = "Select file")
root.geometry("775x300")
k=Label(frame,text="SELECTED SUBTITLE",font=("Times New Roman", 15)).grid(column=3, row =0)
y=Label(frame,text=filename1,font=("Times New Roman", 12)).grid(column=3, row =1)
seconds=Label(root, font=("Times New Roman", 15),text="Seconds").grid(column=2,row=2)
minutes=Label(root, font=("Times New Roman", 15),text="Minutes").grid(column=0,row=2,ipadx=20)
minuteselect = StringVar()
minutes = ttk.Combobox(root, textvariable=minuteselect)
minutes['values']=tuple([i for i in range(1,61)])
minutes['state'] = 'readonly' 
minutes.grid(column=0,row=4,padx=10)
secondselect = StringVar()
seconds = ttk.Combobox(root, textvariable=secondselect)
seconds['values']=tuple([i for i in range(1,61)])
seconds['state'] = 'readonly' 
seconds.grid(column=2,row=4)
plus =Button(root,text="DECREASE", width='10', height='1').place(x=400,y=150)
minus =Button(root,text="INCREASE", width='10', height='1').place(x=280,y=150)
b =Button(frame,text="Select The Subtitle", width='30', height='1',command=open)
b.grid(row=1, column=1,padx=41,pady=30)
b.rowconfigure(1, weight=1)
b.columnconfigure(1, weight=1)
root.mainloop()

我正在尝试构建一个应用程序,它可以同步srt文件,并在根据用户输入同步字幕文件的时间后创建一个新文件。我目前被困在如何从两个组合框中检索数据,并根据用户的输入处理文件上。在我的代码中,我尝试直接输入一个文件,并打开了第二个窗口,该窗口使用2个组合框和两个按钮INCREASE和DECREASE提供了分钟和秒选项。如果单击增加,它将重定向到一个函数,该函数从组合框获得输入,并使用模块pysrt提供的函数增加srt文件中的时间,反之亦然。我目前不知道如何获得两个输入:(1(以秒和分钟为单位的时间,以及(2(增加或减少按钮并相应地调用函数。

我要做的第一件事就是重组您的代码。您正在执行open功能中的所有操作,这会使您的生活变得复杂。此外,您还消除了用户更改用于转换的.srt文件的可能性。

我会使用1个表单来包含所有控件。

  1. 选择.srt文件的按钮
  2. 分钟的组合框
  3. 秒的组合框
  4. "保存"按钮

然后在按下我建议的Save按钮时触发的事件上施加实际的魔法。在这里,您只需从2个组合框中获得值,并使用它来根据这些值偏移字幕。

现在,这实际上并不能正确回答你的问题,这是我很久以前处理同一个应用程序的方式。次计时真的很麻烦:-|

为了真正回答您的问题,如果您想使用按钮和组合框,所需的逻辑会发生一些变化。您需要创建全局变量来保存分钟和秒,并考虑到如果秒设置为59,并且用户按下INCREASE按钮数秒,则秒应重置为0,分钟应增加1。当然,递减的情况正好相反。(1毫秒-->0毫秒59秒(。

按钮的逻辑应该转到单独的功能,就像您对open按钮所做的那样;作用绑定它们,就像在实例化它们时使用command关键字对open函数所做的那样。把逻辑放在那里更新全局分钟&第二个变量,并使用combobox.set(value)(docs(更新组合框值。

您可能还希望将事件绑定到正在更改的组合框本身。查看pydocs和这个来自nbro 的优秀答案

最后,您仍然需要Save按钮来实际更新.srt文件中的值。

一些旁注:

  • 您使用的分钟范围&在我看来,秒似乎不正确。我会使用range(0,60),因为你需要0的选项,而不需要60的选项(因为这将分别变为1小时或1分钟。考虑到你想固定字幕的时间,使用小时似乎很荒谬。不过,使用毫秒似乎很有用
  • 您应该能够处理负值。字幕要么早要么晚,按照目前的逻辑,你只能处理字幕早的情况

最新更新