如何访问单个Button tkinter?

阿比舍克·贡塔卡

目标:动态创建标签和按钮(代表任务),当我单击此按钮时,它应该销毁标签和按钮。

问题:无法单独访问按钮

这是我的代码:

class Gui:

    # constructor
    def __init__(self, root):
        self.root = root
        self.root.title("TASKS")
        self.root.geometry("300x700")
        self.root.resizable(width=False, height=False)
        self.clock = Label(self.root, fg="blue")
        self.clock.grid(row = 0,column = 0,padx = 80,pady = 40)
        self.update_clock()
        self.new_button = Button(self.root, text="New",command = self.newwindow).grid(row = 0, column =1)
        self.r =0
    # clock
    def update_clock(self):
        now = strftime("%H:%M:%S")
        self.clock.configure(text=now)
        self.clock.after(1000, self.update_clock)

    # label creator
    def label(self, txt):
        self.l = Label(self.root, text=txt, fg="red",pady =15)
        self.l.grid(row = self.r, column =0)

    # button creator
    def donebutton(self):
        self.b = Button(self.root, text="Done",command = lambda : self.del_task())
        self.b.grid(row = self.r,column = 1)

    # create a task
    def task(self,txt):
        self.r +=1
        self.label(txt)
        self.donebutton()

    # delete task
    def del_task(self):
        self.l.destroy()
        self.b.destroy()

    # display gui method
    def display(self):
        self.root.mainloop()

    # new window
    def newwindow(self):
        self.newwindow = Toplevel(self.root)
        self.newwindow.title("NEW TASK")
        self.newwindow.geometry("300x200")
        self.newwindow.resizable(width=False, height=False)
        Label(self.newwindow,text="Task").grid()
        self.t1 = Text(self.newwindow,height = 2,width = 36)
        self.t2 = Text(self.newwindow,height = 2,width = 10)
        self.t1.grid()
        Label(self.newwindow, text="Time").grid()
        self.t2.grid()
        self.c_b=Button(self.newwindow,text = "CREATE",command = lambda : self.task(self.t1.get("1.0",END)))

        self.c_b.grid()

if __name__ == '__main__':
    a = Gui(Tk())
    a.display()

在代码方面寻求帮助,我不介意更改整个代码。

迈克尔·吉德利

您继续覆盖按钮。您说您不在乎代码是否完全不同,因此,我更改了很多。

  • Windows,时钟和任务分为几类
  • 没有保留对窗口或按钮的可定向引用
  • command为“新按钮”创建NewTasks窗口
  • command为“完成按钮”破坏它的父
  • command为“创建按钮”创建一个Task主窗口
  • 添加了可滚动的框架,因此任务永远不会垂直溢出主窗口
  • 开始,暂停,完成,删除Buttons被列入
  • 包括一个可滚动的输出面板
  • 包括在显示器中重新定位任务的功能
  • 可以单击任务标签以在输出面板中显示其内容
  • 开始,暂停和完成报告到输出,并且完成包括经过的时间
  • 任务一旦启动,便无法删除
  • 如果任务正在运行,则只能“完成”
  • 应用了少量的小部件/网格格式,以防止显示在创建/删除任务时跳动

我很无聊并构建了您的应用程序……可能。


from tkinter import Tk, Button, Label, Toplevel, Text, Frame, Canvas, Scrollbar
from time import strftime, time


class Task(Frame):    
    def __init__(self, master, text, output, move, **kwargs):
        Frame.__init__(self, master, **kwargs)
        self.grid_columnconfigure(0, weight=1)
        
        self.stored     = []
        self.starttime  = 0
        self.send_output= output
        
        self.lbl = Label(self, text=text, height=1, anchor='nw', fg='blue', font='calibri 14')
        self.lbl.grid(row=0, column=0, sticky='nswe')
        self.lbl.bind('<1>', self.output)
        
        font = 'consolas 10 bold'
        self.b1 = Button(self, font=font, text=chr(9654), command=self.start)
        self.b2 = Button(self, font=font, text=chr(10073)+chr(10073), state='disabled', command=self.pause)
        self.b3 = Button(self, font=font, text=chr(10006), state='disabled', command=self.done)
        self.b4 = Button(self, font=font, text=chr(9866), command=self.destroy)
        self.b5 = Button(self, font=font, text=chr(9650), command=lambda: move(self, -1))
        self.b6 = Button(self, font=font, text=chr(9660), command=lambda: move(self, 1))
        
        self.b1.grid(row=0, column=1) #start
        self.b2.grid(row=0, column=2) #pause
        self.b3.grid(row=0, column=3) #done
        self.b4.grid(row=0, column=4) #remove
        self.b5.grid(row=0, column=5) #move up
        self.b6.grid(row=0, column=6) #move down
        
    def start(self):
        self.b1['state'] = 'disabled'
        self.b2['state'] = 'normal'
        self.b3['state'] = 'normal'
        self.b4['state'] = 'disabled'
        
        self.starttime = time()
        self.send_output(f"{self.lbl['text']}", f"{strftime('%I:%M:%S')} STARTED: ")
        
    def pause(self):
        self.b1['state'] = 'normal'
        self.b2['state'] = 'disabled'
        self.b3['state'] = 'disabled'
        
        self.stored.append(time() - self.starttime)
        self.send_output(f"{self.lbl['text']}", f"{strftime('%I:%M:%S')} PAUSED: ")
        
    def done(self):
        self.stored.append(time() - self.starttime)
        t = sum(self.stored)
        self.send_output(f"{self.lbl['text']}\telapsed time: {self.etime(t)}\n", f"{strftime('%I:%M:%S')} FINISHED: ")
        self.destroy()
        
    def etime(self, s):
        h = int(s//3600)
        s -= 3600*h
        m = int(s//60)
        s -= 60*m
        return f'{h:02}:{m:02}:{int(s):02}'
        
    def output(self, event):
        self.send_output(self.lbl['text'], 'Task: ')
        
        
class NewTasks(Toplevel):
    WIDTH  = 416
    HEIGHT = 50

    def __init__(self, master, slave, output, move, **kwargs):
        Toplevel.__init__(self, master, **kwargs)
        self.title("New Task")
        self.geometry(f'{NewTasks.WIDTH}x{NewTasks.HEIGHT}')
        self.resizable(width=False, height=False)

        Label(self, text="Task").grid(row=0, column=0)
        txt = Text(self, height=2, width=36, font='consolas 12')
        txt.grid(row=0, column=1)

        Button(self, text="CREATE", command=lambda: self.create(slave, output, move, txt)).grid(row=0, column=2, sticky='e', padx=4, pady=12)

    def create(self, target, output, move, txt):
        t = Task(target.frame, txt.get("1.0",'end'), output, move)
        t.grid(column=0, sticky='nswe')
        target.update(t)
        

class ScrollFrame(Canvas):
    def __init__(self, master, **kwargs):
        Canvas.__init__(self, master, **kwargs)
        vsb = Scrollbar(self, orient='vertical', command=self.yview)
        vsb.pack(side='right', fill='y')
        self.configure(yscrollcommand=vsb.set)
        
        self.frame = Frame(self, height=0)
        self.frame.grid_columnconfigure(0, weight=1)
        self.frame.bind('<Configure>', lambda e:self.configure(scrollregion=self.bbox("all")))
        self.create_window((0,0), width=App.WIDTH-20, window=self.frame, anchor="nw")
        
        self.movelist = []
        
    def update(self, target):
        self.movelist.append(target)
        
    def move_item(self, elem, dir=1):
        c = self.frame.winfo_children()
        i = self.movelist.index(elem)
        if i+dir in range(0, len(self.movelist)):
            e = self.movelist.pop(i)
            self.movelist.insert(i+dir, e)
            for n in range(len(self.movelist)):
                while n < len(self.movelist) and self.movelist[n] not in c:
                    self.movelist.pop(n)
                    
                if n < len(self.movelist):  
                    self.movelist[n].grid(row=n, column=0, sticky='nswe')
                    continue
                break


class Clock(Label):
    def __init__(self, master, **kwargs):
        Label.__init__(self, master, **kwargs)
        self.update()
        
    def update(self):
        self['text'] = strftime('%I:%M:%S')
        self.after(1000, self.update)


class App(Tk):
    WIDTH  = 600
    HEIGHT = 447

    def __init__(self, **kwargs):
        Tk.__init__(self, **kwargs)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        Clock(self, fg="blue", font='calibri 18').grid(row=0, column=0, ipady=10, sticky='nswe')
        
        sf = ScrollFrame(self, highlightthickness=0)
        sf.grid(row=1, column=0, columnspan=3, sticky='nswe')
        
        command = lambda: NewTasks(self, sf, self.output, sf.move_item)
        Button(self, text="New", font='calibri 12', command=command).grid(row=0, column=1, columnspan=2)
        
        self.out = Text(self, height=8, font="calibri 14")
        self.out.grid(row=2, column=0, columnspan=2)
        self.out.tag_configure("bold", font="calibri 12 bold")
        
        vsb = Scrollbar(self, orient='vertical', command=self.out.yview)
        vsb.grid(row=2, column=2, sticky='ns')
        
        self.out.configure(yscrollcommand=vsb.set)

    def output(self, text, btext=''):
        self.out.insert('end', btext, 'bold')
        self.out.insert('end', text)
        

if __name__ == '__main__':
    app = App()
    app.title("Task Scheduler")
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}')
    app.resizable(width=False, height=False)
    app.mainloop()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得tkinter Button的大小?

来自分类Dev

访问OptionMenu项-Tkinter

来自分类Dev

如何通过tcl访问Menu Tkinter?

来自分类Dev

如何使用Tkinter Button从Python退出?

来自分类Dev

如何在Tkinter中的单个按钮中分配多个命令

来自分类Dev

如何更新tkinter标签

来自分类Dev

如何使Tkinter画布更新?

来自分类Dev

如何更新Tkinter标签?

来自分类Dev

tkinter代码如何执行?

来自分类Dev

如何清除图tkinter

来自分类Dev

如何关闭 tkinter 画布?

来自分类Dev

如何在Tkinter中访问标签以更改其文本

来自分类Dev

如何在tkinter中访问不同类的变量?

来自分类Dev

每次在Tkinter中如何访问一个不同的按钮?

来自分类Dev

如何在tkinter python中访问选定的变量

来自分类Dev

如何访问类中的变量?- Python - Tkinter 窗口

来自分类Dev

如何保存附加到tkinter Button的函数的返回值?

来自分类Dev

如何保存附加到tkinter Button的函数的返回值?

来自分类Dev

如何为tkinter Button的命令功能结果设置变量?

来自分类Dev

在Tkinter中,如何禁用Entry?

来自分类Dev

如何居中Tkinter小部件?

来自分类Dev

如何隐藏Tkinter python Gui

来自分类Dev

如何使用tkinter清除窗口

来自分类Dev

Tkinter:如何确定顶级职位?

来自分类Dev

如何更改Tkinter文本颜色

来自分类Dev

tkinter:后方法如何使用

来自分类Dev

TkInter:如何显示普通光标?

来自分类Dev

Tkinter:如何创建选择框

来自分类Dev

如何定期更改tkinter图像?