zsx080221 2022-07-20 19:35 采纳率: 100%
浏览 20
已结题

如何在自定义函数中引用外部自定义函数时发生了问题?(语言-python)

问题遇到的现象和发生背景

我在编一段类似于阅读器的程序时,在函数中引用外部自定义函数时发生了问题(与我想象的结果不同)。我发现即使把外部自定义函数的代码放入也不能解决问题,但是代码放入后如果在主程序中直接使用函数就没有问题。求解决办法,谢谢。

问题相关代码,请勿粘贴截图

程序模块

import tkinter as tk
import tkinter.messagebox as tkm
import os
import sys
sys.path.append(r'C:\Users\Administrator\Desktop\Python\自定义函数库')
import 小说截取章节
import 文件选择窗口
import delete_dir
top = tk.Tk()
E1 = tk.Entry(top)
def next_cha(): #下一章
global cha_choose,cha_list
if cha_choose<len(cha_list):
cha_choose+=1
get_text(cha_choose)
def last_cha(): #上一章
global cha_choose,cha_list
if cha_choose>1:
cha_choose-=1
get_text(cha_choose)
else:
pass
def get_text(cha_choose): #获取章节内容
global cha_text,cha_path,cha_list
cha_name_have=cha_list[int(cha_choose)-1]
cha_name=cha_name_have[:-1]
w['text']=cha_name
with open (cha_path+'//'+str(int(cha_choose)-1)+'.txt',mode='r') as f:
text=f.read()
t.delete(0.0,'end')
t.pack() #让t可以瞬间反应
t.insert(0.0,text)
top.mainloop()
def choose_text(): #阅读界面初始化
global top,cha_choose,cha_list,back
cha_choose_str=E1.get()
if not back:
if not cha_choose_str.isdigit():
tkm.showwarning('','请输入阿拉伯数字')
return
else:
if not 1<= int(cha_choose_str) <= len(cha_list):
tkm.showwarning('','请输入有效数字')
return
back=True
cha_choose=int(cha_choose_str)
E1.delete(0)
E1.pack_forget()
B['text']='返回章节列表'
B['command']=choose_cha_ini
B2.pack_forget()
B_last.pack()
B_next.pack()
get_text(cha_choose)
top.mainloop()

def get_new(): #写入新书
global add
cha_have=''
new_path=E_path.get()
new_name=E_name.get()
text_list=小说截取章节.jiequ(new_path)
dir_path='C:/Users/Administrator/Desktop/Python/pykindle/'+new_name
if not os.path.exists(dir_path):
os.makedirs(dir_path)
else:
delete_dir.delete_dir(dir_path)
os.makedirs(dir_path)
name_str=''
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='r',encoding='utf-8') as f:
name_list=f.readlines()
for x in name_list:
if x != new_name:
name_str_have=name_str+x+'\n'
name_str=name_str[:-1]
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='w',encoding='utf-8') as f:
f.write(name_str)
for x in range(len(text_list[1])):
cha_have+=text_list[0][x]+'\n'
text=text_list[1][x]
cha_path=dir_path+'/'+str(x)+'.txt'
with open(cha_path,mode='w') as f:
f.write(text)
cha=cha_have[:-1]
with open(dir_path+r'/章节列表.txt',mode='w') as f:
f.write(cha)
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='a',encoding='utf-8') as f:
f.write(new_name+'\n')
add.destroy()
book_choose_ini()
def add_new(): #添加新书界面
global E_path,E_name,add
add=tk.Tk()
E_path = tk.Entry(add)
E_name = tk.Entry(add)
w_path=tk.Label(add, text='new path?')
w_name=tk.Label(add, text='new name?')
b_browse=tk.Button(add,text='browse',command=choose_browse)
b_new_finish=tk.Button(add, text='finish', command=get_new)
E_path.insert(0,'C://Users//Administrator//Desktop//')
w_path.pack()
E_path.pack()
b_browse.pack()
w_name.pack()
E_name.pack()
b_new_finish.pack()
add.mainloop()
def choose_browse():
global add
path=文件选择窗口.main()
E_path.delete(0.0)
E_path.insert(0.0,path)

def choose_cha_ini(): #章节选择界面初始化
global cha_list,cha_path,t,cha_text,book_choice,top,B2,book_title,book_list,back
if not back:
book_choice=E1.get()
if not book_choice.isdigit():
tkm.showwarning('','请输入阿拉伯数字')
return
else:
if not 1<= int(book_choice) <= len(book_list):
tkm.showwarning('','请输入有效数字')
return
back=True
B_next.pack_forget()
B_last.pack_forget()
book_name=book_list[int(book_choice)-1] #获取书名
cha_path='C://Users//Administrator//Desktop//Python//pykindle//'+book_name[:-1]
with open(cha_path+'//章节列表.txt',mode='r') as f:
cha_text=f.read()
f.seek(0,0)
cha_list=f.readlines() #获取章节列表
B2['text']='返回书目列表'
B2['command']=book_choose_ini
E1.delete(0)
t.pack_forget()
B.pack_forget()
B3.pack_forget()
E1.pack()
B2.pack()
B.pack()
t.pack()
w['text']='章节列表'
B['text']='选择'
B['command']=choose_text
t.delete(0.0,'end')
t.insert(0.0,'请输入阿拉伯数字\n'+cha_text)
sc.pack(side="right",fill='y')
t.pack(side="left")
sc.config(command=t.yview)
top.mainloop()
def booktitlelist(): #获取书目列表
y=0
title_str=''
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='r',encoding='utf-8',errors='ignore') as f:
title=f.readlines()
for x in title:
y+=1
title_str=title_str+str(y)+':'+x
return title_str
def book_choose_ini(): #书目选择界面初始化
global book_title,top,back,book_list
book_title=booktitlelist()
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='r',encoding='utf-8',errors='ignore') as f:
book_list=f.readlines()
back=False
w['text']='书目列表'
B['command']=choose_cha_ini
B['text']='选择'
B2['text']='添加'
B2['command']=add_new
t.delete(0.0,'end')
t.insert(0.0,'请输入阿拉伯数字\n'+book_title)
B2.pack_forget()
t.pack_forget()
w.pack_forget()
E1.pack_forget()
B.pack_forget()
B3.pack_forget()
w.pack()
E1.pack()
B.pack()
B2.pack()
B3.pack()
t.pack()
top.mainloop()
def book_delete_ini():
global top,E1,book_list
delete_choose=E1.get()
E1.delete(0)
if not delete_choose.isdigit():
tkm.showwarning('','请输入阿拉伯数字')
return
else:
if not 1<= int(delete_choose) <= len(book_list):
tkm.showwarning('','请输入有效数字')
return
book_name=book_list[int(delete_choose)-1]
book_path='C://Users//Administrator//Desktop//Python//pykindle//'+book_name[:-1]
delete_dir.delete_dir(book_path)
name_str=''
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='r',encoding='utf-8',errors='ignore') as f:
name_list=f.readlines()
for x in name_list:
if x != book_name:
name_str=name_str+x+'\n'
name_str=name_str[:-1]
with open(r'C:\Users\Administrator\Desktop\Python\pykindle\书目列表.txt',mode='w',encoding='utf-8',errors='ignore') as f:
f.write(name_str)
book_choose_ini()
#初始设置
#top = tk.Tk()
sc=tk.Scrollbar(top)
sc.pack(side="right",fill='y')
t =tk.Text(top,yscrollcommand=sc.set,font=(24))
t.pack(side="left")
t.pack_forget()
sc.pack_forget()
B2=tk.Button(top)
B_last=tk.Button(top,anchor='nw',text='上一章',command=last_cha)
B_next=tk.Button(top,anchor='ne',text='下一章',command=next_cha)
B3=tk.Button(top,text='删除',command=book_delete_ini)
B3.pack_forget()
B_next.pack_forget()
B_last.pack_forget()
w = tk.Label(top)
E1 = tk.Entry(top)
B = tk.Button(top)
E1.pack_forget()
w.pack_forget()
B.pack_forget()
#开始
book_choose_ini()

外部自定义函数(文件选择窗口.py)

import tkinter as tk
import os
import re
import tkinter.messagebox as tkm

def choose():
global root,v,path1
root=tk.Tk()
B_l=tk.Button(root,text='返回',command=back)
B_l.pack()
v = tk.StringVar()
dir_list=[]
dir_list=os.listdir(path1)
for x in dir_list:
b=tk.Radiobutton(root,text=x,variable=v,value=x,indicatoron=False,command=alpha)
b.pack(anchor='w')
root.mainloop()
def alpha():
global root,v,path1,last_path,result
name=v.get()
print(name)

path1+='\'+name
root.destroy()
if os.path.isfile(path1):

    result=path1
else:
    choose()

def back():
global path1,root
print('3')
patt1=re.compile(r'\[^\]*$')
m=re.search(patt1,path1)
try:
path1=path1[:m.start()]
except:
pass
else:
root.destroy()
choose()
def main():
global result,last_path,path1
path1=r'C:\Users\Administrator\Desktop'
last_path=''
result=''
choose()
print(result)
return result

运行结果及报错内容

img

我点选按钮后还是这个界面,它本应关闭后不再出现,但它在关闭后又出现了

文件选择窗口中print(name)是调试作用,但在主程序里,我选择文件后,name本应该等于文件名,但我发现它等于空格,于是出现了问题

我的解答思路和尝试过的方法

我本来以为是v作用域的问题,但我尝试后发现好像不是这个问题

我想要达到的结果

解决问题

  • 写回答

2条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-07-20 21:29
    关注

    代码格式混乱,不易排错。
    大概浏览了一下,你的外部函数又创建了一个Tk根窗口,这通常会带来很多问题,组件的指向会发生混乱,所以可能会造成一些变量的值与预期不同。一般都建议使用toplevel来创建子窗口。
    不过代码格式太混乱了,没法帮你调试。所以仅供参考。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 7月20日

悬赏问题

  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用