鱼C论坛

 找回密码
 立即注册
查看: 2186|回复: 8

[已解决]【求助】封装后无法使用tkinter库中的get()属性

[复制链接]
发表于 2022-7-25 22:09:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Aden 于 2022-7-26 00:18 编辑

求各位大神指教,下面代码中我将代码封装后,在代码备注的地方写了个函数,调用Entry的get(),无法调用,但是封装前却可以调用,同样的语法封装class后无法调用是为啥啊,咋解决呢






  1. import tkinter as tk
  2. import time
  3. from tkinter import *


  4.    
  5. class Root_page:
  6.    
  7.     def off_work(self):
  8.         self.page_main.grid_forget()
  9.         self.page_wktime = tk.Frame(self.window)
  10.         self.page_wktime.grid(row = 0,column=0,padx =78,pady =60)

  11.         now_time= time.strftime('%Y-%m-%d %H:%M:%S')
  12.         
  13.         off_work_time = now_time[0:11] + '17:30:00'
  14.         make_off_time = time.mktime(time.strptime(off_work_time,'%Y-%m-%d %H:%M:%S'))
  15.         interval_time = make_off_time - time.time()
  16.         off_min = divmod(interval_time,60)
  17.         
  18.         time_label_1 = tk.Label(self.page_wktime,text=f"现在是 {(time.strftime('%H点%M分%S秒'))}",width= 25,height=2)
  19.         time_label_2 = tk.Label(self.page_wktime,text=f"距离下班还有 {int(off_min[0])}分钟{round(off_min[1],3)}秒",width= 25,height=2)
  20.         time_label_1.grid(row = 0,column=1,padx =30 ,pady =10)
  21.         time_label_2.grid(row = 1,column=1,padx =30 ,pady =10)
  22.         tk.Button(self.page_wktime,text='返回',width=15,command = self.back_main_1).grid(row = 2,column=1,padx =30 ,pady =30)
  23.    

  24.    
  25.     def back_main_1(self):
  26.         self.page_wktime.grid_forget()
  27.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  28.         
  29.     def back_main_2(self):
  30.         self.page_set_time.place_forget()
  31.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  32.    
  33.     def get_off_time(self):
  34.         print(self.enter_int_1.get())
  35.         print(self.enter_int_2.get())


  36.     def set_offtime(self):
  37.         self.page_main.grid_forget()
  38.         self.page_set_time = tk.Frame(self.window)
  39.         self.page_set_time.place(relx = 0.5,rely=0.3,anchor=CENTER,relheight=0.75,relwidth=0.75)
  40.         
  41.         tk.Label(self.page_set_time,text = '时').place(x = 130,y=125)
  42.         tk.Label(self.page_set_time,text = '分').place(x = 200,y=125)
  43.         
  44.         self.t1 = tk.StringVar()
  45.         self.t2 = tk.StringVar()
  46.         
  47.         self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4).place(x=95,y=125)
  48.         self.enter_int_2 = tk.Entry(self.page_set_time,textvariable=self.t2,width = 4).place(x =165,y=125)
  49.         

  50.         tk.Label(self.page_set_time,text = '注意:请使用24小时制,不足2位数请加0补位').place(relx = 0.5,rely=0.65,anchor=CENTER)
  51.         tk.Button(self.page_set_time,text='返回',width=8,command = self.back_main_2).place(relx = 0.7,rely=0.8,anchor=CENTER)   
  52.         tk.Button(self.page_set_time,text='确定',width=8,command = self.get_off_time).place(relx = 0.3,rely=0.8,anchor=CENTER)
  53.         #上一行command 调用函数get_off_time时无法调用tkinter库get()属性   
  54.    


  55.         
  56.     def __init__(self,master):
  57.         self.window = master
  58.         self.window.title('摸鱼 Demo 1.0')
  59.         self.window.geometry('400x400')
  60.         self.window.resizable(width=False, height=False)

  61.         
  62.         self.page_main = tk.Frame(self.window)
  63.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  64.         tk.Button(self.page_main,text='还有多久下班',width=15,command = self.off_work).grid(row = 0,column=1,padx =10 ,pady =10)
  65.         tk.Button(self.page_main,text='设置下班时间',width=15,command = self.set_offtime).grid(row = 1,column=1,padx =10 ,pady =10)
  66.         tk.Button(self.page_main,text='中午吃什么',width=15,).grid(row = 2,column=1,padx =10 ,pady =10)
  67.         tk.Button(self.page_main,text='退出',width=15,command = self.window.quit).grid(row = 5,column=1,padx =10 ,pady =10)


  68.         
  69.         
  70.    


  71. if __name__ == '__main__':
  72.     window = tk.Tk()
  73.     Root_page(master = window)
  74.     window.mainloop()



复制代码
最佳答案
2022-7-26 00:35:09
Aden 发表于 2022-7-26 00:20
因为我复制的时候缩进错了,所以找不到,调整了缩进,就找到了,我把修改过的更新了,你再看看,我这边错 ...


果然经典错误,我之前也犯过
  1. self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4).place(x=95,y=125)
  2. self.enter_int_2 = tk.Entry(self.page_set_time,textvariable=self.t2,width = 4).place(x =165,y=125
复制代码

这两行self.enter_int_1和self.enter_int_2被赋值成了什么,tk.Entry还是place函数执行后的返回值,答案是place函数执行后的返回值也就是None
而None没有get方法,所以报了错
解决方法:将self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4)与self.enter_int_1.place(x=95,y=125)分开写
代码:
  1. import tkinter as tk
  2. import time
  3. from tkinter import *


  4.    
  5. class Root_page:
  6.    
  7.     def off_work(self):
  8.         self.page_main.grid_forget()
  9.         self.page_wktime = tk.Frame(self.window)
  10.         self.page_wktime.grid(row = 0,column=0,padx =78,pady =60)

  11.         now_time= time.strftime('%Y-%m-%d %H:%M:%S')
  12.         
  13.         off_work_time = now_time[0:11] + '17:30:00'
  14.         make_off_time = time.mktime(time.strptime(off_work_time,'%Y-%m-%d %H:%M:%S'))
  15.         interval_time = make_off_time - time.time()
  16.         off_min = divmod(interval_time,60)
  17.         
  18.         time_label_1 = tk.Label(self.page_wktime,text=f"现在是 {(time.strftime('%H点%M分%S秒'))}",width= 25,height=2)
  19.         time_label_2 = tk.Label(self.page_wktime,text=f"距离下班还有 {int(off_min[0])}分钟{round(off_min[1],3)}秒",width= 25,height=2)
  20.         time_label_1.grid(row = 0,column=1,padx =30 ,pady =10)
  21.         time_label_2.grid(row = 1,column=1,padx =30 ,pady =10)
  22.         tk.Button(self.page_wktime,text='返回',width=15,command = self.back_main_1).grid(row = 2,column=1,padx =30 ,pady =30)
  23.    

  24.    
  25.     def back_main_1(self):
  26.         self.page_wktime.grid_forget()
  27.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  28.         
  29.     def back_main_2(self):
  30.         self.page_set_time.place_forget()
  31.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  32.    
  33.     def get_off_time(self):
  34.         print(self.enter_int_1.get())
  35.         print(self.enter_int_2.get())


  36.     def set_offtime(self):
  37.         self.page_main.grid_forget()
  38.         self.page_set_time = tk.Frame(self.window)
  39.         self.page_set_time.place(relx = 0.5,rely=0.3,anchor=CENTER,relheight=0.75,relwidth=0.75)
  40.         
  41.         tk.Label(self.page_set_time,text = '时').place(x = 130,y=125)
  42.         tk.Label(self.page_set_time,text = '分').place(x = 200,y=125)
  43.         
  44.         self.t1 = tk.StringVar()
  45.         self.t2 = tk.StringVar()
  46.         
  47.         self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4)
  48.         self.enter_int_1.place(x=95,y=125)
  49.         self.enter_int_2 = tk.Entry(self.page_set_time,textvariable=self.t2,width = 4)
  50.         self.enter_int_2.place(x =165,y=125)
  51.         

  52.         tk.Label(self.page_set_time,text = '注意:请使用24小时制,不足2位数请加0补位').place(relx = 0.5,rely=0.65,anchor=CENTER)
  53.         tk.Button(self.page_set_time,text='返回',width=8,command = self.back_main_2).place(relx = 0.7,rely=0.8,anchor=CENTER)   
  54.         tk.Button(self.page_set_time,text='确定',width=8,command = self.get_off_time).place(relx = 0.3,rely=0.8,anchor=CENTER)
  55.         #上一行command 调用函数get_off_time时无法调用tkinter库get()属性   
  56.    


  57.         
  58.     def __init__(self,master):
  59.         self.window = master
  60.         self.window.title('摸鱼 Demo 1.0')
  61.         self.window.geometry('400x400')
  62.         self.window.resizable(width=False, height=False)

  63.         
  64.         self.page_main = tk.Frame(self.window)
  65.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  66.         tk.Button(self.page_main,text='还有多久下班',width=15,command = self.off_work).grid(row = 0,column=1,padx =10 ,pady =10)
  67.         tk.Button(self.page_main,text='设置下班时间',width=15,command = self.set_offtime).grid(row = 1,column=1,padx =10 ,pady =10)
  68.         tk.Button(self.page_main,text='中午吃什么',width=15,).grid(row = 2,column=1,padx =10 ,pady =10)
  69.         tk.Button(self.page_main,text='退出',width=15,command = self.window.quit).grid(row = 5,column=1,padx =10 ,pady =10)


  70.         
  71.         
  72.    


  73. if __name__ == '__main__':
  74.     window = tk.Tk()
  75.     Root_page(master = window)
  76.     window.mainloop()
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-7-25 22:17:22 | 显示全部楼层
缩进问题
  1. import tkinter as tk
  2. import time
  3. from tkinter import *

  4. class Root_page:
  5.     def get_off_time(self):
  6.         print(self.enter_int_1.get())
  7.         print(self.enter_int_2.get())


  8.     def set_offtime(self):
  9.         self.page_main.grid_forget()
  10.         self.page_set_time = tk.Frame(self.window)
  11.         self.page_set_time.place(relx = 0.5,rely=0.3,anchor=CENTER,relheight=0.75,relwidth=0.75)
  12.         
  13.         tk.Label(self.page_set_time,text = '时').place(x = 130,y=125)
  14.         tk.Label(self.page_set_time,text = '分').place(x = 200,y=125)
  15.         
  16.         self.t1 = tk.StringVar()
  17.         self.t2 = tk.StringVar()
  18.         
  19.         self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4).place(x=95,y=125)
  20.         self.enter_int_2 = tk.Entry(self.page_set_time,textvariable=self.t2,width = 4).place(x =165,y=125)
  21.         

  22.         tk.Label(self.page_set_time,text = '注意:请使用24小时制,不足2位数请加0补位').place(relx = 0.5,rely=0.65,anchor=CENTER)
  23.         tk.Button(self.page_set_time,text='返回',width=8,command = self.back_main_2).place(relx = 0.7,rely=0.8,anchor=CENTER)   
  24.         tk.Button(self.page_set_time,text='确定',width=8,command = self.get_off_time).place(relx = 0.3,rely=0.8,anchor=CENTER)
  25.         #上一行command 调用函数get_off_time时无法调用tkinter库get()属性   
  26.    


  27.         
  28.     def __init__(self,master):
  29.         self.window = master
  30.         self.window.title('摸鱼 Demo 1.0')
  31.         self.window.geometry('400x400')
  32.         self.window.resizable(width=False, height=False)

  33.         
  34.         self.page_main = tk.Frame(self.window)
  35.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  36.         tk.Button(self.page_main,text='还有多久下班',width=15,command = self.off_work).grid(row = 0,column=1,padx =10 ,pady =10)
  37.         tk.Button(self.page_main,text='设置下班时间',width=15,command = self.set_offtime).grid(row = 1,column=1,padx =10 ,pady =10)
  38.         tk.Button(self.page_main,text='退出',width=15,command = self.window.quit).grid(row = 5,column=1,padx =10 ,pady =10)


  39.         
  40.         
  41.    


  42. if __name__ == '__main__':
  43.     window = tk.Tk()
  44.     Root_page(master = window)
  45.     window.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-25 22:18:52 | 显示全部楼层
估计不小心点了 tabel 键  缩进问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-25 23:59:11 | 显示全部楼层
qq1151985918 发表于 2022-7-25 22:18
估计不小心点了 tabel 键  缩进问题

缩进应该没毛病,在vscode里标的很齐,层次我也检查过了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-26 00:03:15 | 显示全部楼层

我复制的时候第6行缩进错了,源码实际是没错的,但是问题不是缩进的,是找不到库的属性。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-26 00:06:40 | 显示全部楼层
Aden 发表于 2022-7-26 00:03
我复制的时候第6行缩进错了,源码实际是没错的,但是问题不是缩进的,是找不到库的属性。。。

我没报这个错误啊,只报了找不到off_work函数
  1. D:\command\Python>python test.py
  2. Traceback (most recent call last):
  3.   File "test.py", line 270, in <module>
  4.     Root_page(master = window)
  5.   File "test.py", line 258, in __init__
  6.     tk.Button(self.page_main,text='还有多久下班',width=15,command = self.off_wor
  7. k).grid(row = 0,column=1,padx =10 ,pady =10)
  8. AttributeError: 'Root_page' object has no attribute 'off_work'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-26 00:20:01 | 显示全部楼层
临时号 发表于 2022-7-26 00:06
我没报这个错误啊,只报了找不到off_work函数

因为我复制的时候缩进错了,所以找不到,调整了缩进,就找到了,我把修改过的更新了,你再看看,我这边错误类型为下面的样子,就是找不到get()

  1.   File "d:\Python 文件\【GUI】tkinter 实例\【UI学习】摸鱼Demo.py", line 38, in get_off_time
  2.     print(self.enter_int_1.get())
  3. AttributeError: 'NoneType' object has no attribute 'get'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-26 00:35:09 | 显示全部楼层    本楼为最佳答案   
Aden 发表于 2022-7-26 00:20
因为我复制的时候缩进错了,所以找不到,调整了缩进,就找到了,我把修改过的更新了,你再看看,我这边错 ...


果然经典错误,我之前也犯过
  1. self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4).place(x=95,y=125)
  2. self.enter_int_2 = tk.Entry(self.page_set_time,textvariable=self.t2,width = 4).place(x =165,y=125
复制代码

这两行self.enter_int_1和self.enter_int_2被赋值成了什么,tk.Entry还是place函数执行后的返回值,答案是place函数执行后的返回值也就是None
而None没有get方法,所以报了错
解决方法:将self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4)与self.enter_int_1.place(x=95,y=125)分开写
代码:
  1. import tkinter as tk
  2. import time
  3. from tkinter import *


  4.    
  5. class Root_page:
  6.    
  7.     def off_work(self):
  8.         self.page_main.grid_forget()
  9.         self.page_wktime = tk.Frame(self.window)
  10.         self.page_wktime.grid(row = 0,column=0,padx =78,pady =60)

  11.         now_time= time.strftime('%Y-%m-%d %H:%M:%S')
  12.         
  13.         off_work_time = now_time[0:11] + '17:30:00'
  14.         make_off_time = time.mktime(time.strptime(off_work_time,'%Y-%m-%d %H:%M:%S'))
  15.         interval_time = make_off_time - time.time()
  16.         off_min = divmod(interval_time,60)
  17.         
  18.         time_label_1 = tk.Label(self.page_wktime,text=f"现在是 {(time.strftime('%H点%M分%S秒'))}",width= 25,height=2)
  19.         time_label_2 = tk.Label(self.page_wktime,text=f"距离下班还有 {int(off_min[0])}分钟{round(off_min[1],3)}秒",width= 25,height=2)
  20.         time_label_1.grid(row = 0,column=1,padx =30 ,pady =10)
  21.         time_label_2.grid(row = 1,column=1,padx =30 ,pady =10)
  22.         tk.Button(self.page_wktime,text='返回',width=15,command = self.back_main_1).grid(row = 2,column=1,padx =30 ,pady =30)
  23.    

  24.    
  25.     def back_main_1(self):
  26.         self.page_wktime.grid_forget()
  27.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  28.         
  29.     def back_main_2(self):
  30.         self.page_set_time.place_forget()
  31.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  32.    
  33.     def get_off_time(self):
  34.         print(self.enter_int_1.get())
  35.         print(self.enter_int_2.get())


  36.     def set_offtime(self):
  37.         self.page_main.grid_forget()
  38.         self.page_set_time = tk.Frame(self.window)
  39.         self.page_set_time.place(relx = 0.5,rely=0.3,anchor=CENTER,relheight=0.75,relwidth=0.75)
  40.         
  41.         tk.Label(self.page_set_time,text = '时').place(x = 130,y=125)
  42.         tk.Label(self.page_set_time,text = '分').place(x = 200,y=125)
  43.         
  44.         self.t1 = tk.StringVar()
  45.         self.t2 = tk.StringVar()
  46.         
  47.         self.enter_int_1 = tk.Entry(self.page_set_time,textvariable=self.t1,width = 4)
  48.         self.enter_int_1.place(x=95,y=125)
  49.         self.enter_int_2 = tk.Entry(self.page_set_time,textvariable=self.t2,width = 4)
  50.         self.enter_int_2.place(x =165,y=125)
  51.         

  52.         tk.Label(self.page_set_time,text = '注意:请使用24小时制,不足2位数请加0补位').place(relx = 0.5,rely=0.65,anchor=CENTER)
  53.         tk.Button(self.page_set_time,text='返回',width=8,command = self.back_main_2).place(relx = 0.7,rely=0.8,anchor=CENTER)   
  54.         tk.Button(self.page_set_time,text='确定',width=8,command = self.get_off_time).place(relx = 0.3,rely=0.8,anchor=CENTER)
  55.         #上一行command 调用函数get_off_time时无法调用tkinter库get()属性   
  56.    


  57.         
  58.     def __init__(self,master):
  59.         self.window = master
  60.         self.window.title('摸鱼 Demo 1.0')
  61.         self.window.geometry('400x400')
  62.         self.window.resizable(width=False, height=False)

  63.         
  64.         self.page_main = tk.Frame(self.window)
  65.         self.page_main.grid(row = 0,column=1,padx =130,pady =30)
  66.         tk.Button(self.page_main,text='还有多久下班',width=15,command = self.off_work).grid(row = 0,column=1,padx =10 ,pady =10)
  67.         tk.Button(self.page_main,text='设置下班时间',width=15,command = self.set_offtime).grid(row = 1,column=1,padx =10 ,pady =10)
  68.         tk.Button(self.page_main,text='中午吃什么',width=15,).grid(row = 2,column=1,padx =10 ,pady =10)
  69.         tk.Button(self.page_main,text='退出',width=15,command = self.window.quit).grid(row = 5,column=1,padx =10 ,pady =10)


  70.         
  71.         
  72.    


  73. if __name__ == '__main__':
  74.     window = tk.Tk()
  75.     Root_page(master = window)
  76.     window.mainloop()
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-26 00:45:54 | 显示全部楼层
临时号 发表于 2022-7-26 00:35
果然经典错误,我之前也犯过

这两行self.enter_int_1和self.enter_int_2被赋值成了什么,tk.Entry还是 ...

是的是的,这回可以了,大佬牛啊,我明白了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表