Python中Tkinter写的界面,直接运行有问题,请高手指教

syunqiang 2010-08-26 04:52:03
请教高手,我在IDLE中用Run Model运行程序,打开界面后,点击select按钮,没有问题,可是如果我直接双击文件,打开界面后,点击Select按钮,整个界面就退出了,不知道什么原因!


#!/usr/local/env python
#-*- coding:utf-8 -*-

def getcrd(crdfile):
D = {}
coordlist = open(crdfile,'r')
for eachline in coordlist:
row = eachline.split()
D[row[0]] = row[1] + ' ' + row[2]
return D

def getlas(D, lasfile):
pathlist = lasfile.split('/')
wellname = lasfile[-1]
pathname = '/'.join(pathlist[0:-1])
newpathname = pathname + "/crdlasfile"

if os.path.isdir(newpathname):
crdpath = newpathname
else:
crdpath = os.mkdir(newpathname)

if wellname in D.keys():
crd = D[wellname].split()
xcrd = crd[0]
ycrd = crd[1]
oldlasfile = open(lasfile,'r')
resultfilename = crdpath + '/' + wellname + '.las'
newlasfile = open(resultfilename, 'w')
i = 0
for aline in oldlasfile:
newlasfile.write(aline)
if aline[0:3] == "UWI":
newlasfile.write("XCRD. " + xcrd + ": \n")
newlasfile.write("YCRD. " + ycrd + ": \n")
oldlasfile.close()
newlasfile.close()
else:
logname = crdpath + '/log.txt'
log = open(logname,'a')
log.write(wellname + " isn't in well coordiante file\n")


class TopApp:
def __init__(self, root):

# sone var for return
self.crdname = tkinter.StringVar()
self.lasname = tkinter.StringVar()

# a frame for place widgets
self.frame = tkinter.Frame(root)

# the programe name label
self.labeltitle = tkinter.Label(self.frame, text="Add coordinate to Las file", font="Arial -16 bold")
self.labeltitle.pack()

# the first labelframe for selecting coordinate file
self.labelcrd = tkinter.LabelFrame(self.frame, text=" Select coordinates file: ", labelanchor='nw', relief='groove', bd=2)
self.labelcrd.pack(anchor='w', ipadx=2, ipady=2, padx=2, pady=2)
self.entry = tkinter.Entry(self.labelcrd, bd=2, width=50, textvariable=self.crdname)
self.entry.pack(anchor='w', padx=2, pady=5)
self.buttoncrd = tkinter.Button(self.labelcrd, bd=2, text='Select...', width=10, command=self.COnSelectCrd)
self.buttoncrd.pack(after=self.entry, anchor='e', padx=5, pady=2)
self.buttoncrd.bind('<ButtonRelease-1>', self.COnSelectCrd)

# the second labelframe for selecting las files
self.labellas = tkinter.LabelFrame(self.frame, text=" Select las files: ",labelanchor='nw', relief='groove', bd=2)
self.labellas.pack(anchor='w', ipadx=2, ipady=2, padx=2, pady=2)

# a frame for place listbox and scrollbar
self.listframe = tkinter.Frame(self.labellas)
self.ysrb = tkinter.Scrollbar(self.listframe, orient="vertical")
self.ysrb.pack(side='right', fill='y')
self.dirlist = tkinter.Listbox(self.listframe, bd=2, width=50, listvariable=self.lasname, yscrollcommand=self.ysrb.set)
self.dirlist.pack(anchor='w', padx=2, pady=2)
self.ysrb["command"] = self.dirlist.yview
self.listframe.pack()

#a button for selecting las files
self.buttonlas = tkinter.Button(self.labellas, bd=2, text="Select...", width=10, command=self.COnSelectLas)
self.buttonlas.pack(after=self.listframe, anchor='e', padx=5, pady=2)

# the button for exiting programe
self.buttonexit = tkinter.Button(self.frame, text="Exit", bd=2, width=10, command=root.quit)
self.buttonexit.pack(side='right', padx=5, pady=2)

# the button for running programe
self.buttonrun = tkinter.Button(self.frame, text="Run", bd=2, width=10)
self.buttonrun.pack(side='right', anchor='e', padx=5, pady=2)
#self.buttonrun.bind('<ButtonRelease-1>', getlas())
self.frame.pack()



def COnSelectCrd(self):
filename = tkinter.filedialog.askopenfilename(title="Coordinate file")
self.crdname.set(filename)

def COnSelectLas(self):
filelist = tkinter.filedialog.askopenfilenames(title="Las files")
self.lasname.set(filelist)




if __name__ == "__main__":
import os
import tkinter
root = tkinter.Tk()
root.title("Crd2Las")
TopApp(root)
root.mainloop()



#crd = getcrd("coordinate.prn")
#getlas(crd, "Y57.LAS")

...全文
681 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_NBFA 2010-08-27
  • 打赏
  • 举报
回复
是你代码写的有问题.
tkinter.filedialog是个模块你根本么导入.
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
自己搞定了,Python3.1.2中使用的对话框不稳定,在2.x版本中使用tkFileDialog模块,利用askopenfilenam没有问题,非常稳定!而在3.x版本中,没有tkFileDialog,取而代之的是tkinter模块(2.x是Tkinter,首字母大小写变了)中filedialog中的askopenfilename,但是不稳定,所以改用2.x版本了。
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 syunqiang 的回复:]

哦,谢谢,那我仔细看看帮助,非常感谢,还要感谢angel_su,不过我结贴了,没办法给angel_su分了,抱歉,谢谢你们,你有有问题还请多指教,谢谢!
[/Quote]
错了,呵呵,是以后有问题请多指教,哈哈
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
哦,谢谢,那我仔细看看帮助,非常感谢,还要感谢angel_su,不过我结贴了,没办法给angel_su分了,抱歉,谢谢你们,你有有问题还请多指教,谢谢!
I_NBFA 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 syunqiang 的回复:]
哦,谢谢,因为在2.x版本中是tkFileDialog ,现在变成3.x版本了,不知道还要这样导入,谢谢了,能否推荐一下3.x版本学习 tkinter的书呢?
[/Quote]
其实都大同小异, 主要是重新组织下包逻辑用着更"自然".
就象urllib/urllib2全合并到urllib, 还有httplib啥的.
功能基本无变化, 连名字都一样.
所以打开帮助直接查名字基本89不离10, 而自带的帮助就是很好的tkinter书,
尤其你在python2.x下又有一定基础, 我认为没必要再找其他的书了.
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
哦,谢谢,因为在2.x版本中是tkFileDialog ,现在变成3.x版本了,不知道还要这样导入,谢谢了,能否推荐一下3.x版本学习 tkinter的书呢?
angel_su 2010-08-27
  • 打赏
  • 举报
回复
在idle里运行没问题,应该是idle也是用到tkinter,所以测试tkinter脚本最好不要用idle。
一般有错误解释器会反馈信息,务必看看先。import tkinter估计只有常量和一般控件,要用askopenfilename那么import tkinter.filedialog是必须的...
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
噢,谢谢你,学习了,我用2.x版本改了,刚改好,帖子博客上了,界面就是博客里的样子,您可以看看,再次感谢。
I_NBFA 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 syunqiang 的回复:]
呵呵,我的程序双击没有问题,就界面打开后,点击界面上的按钮时才退出
[/Quote]
那是, 你select之后才运行到有问题的代码.
这是逻辑错误, 静态语言也得干瞪眼.
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
呵呵,我的程序双击没有问题,就界面打开后,点击界面上的按钮时才退出
I_NBFA 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 syunqiang 的回复:]
2.x中的tkFileDialog模块是需要导入的,也就是所需要:
import Tkinter
import tkFileDialog
然后调用tkFileDialog.askopenfilename()

在3.x版本中,直接导入tkinter就可以:
import tkinter
然后就有tkinter.filedialog.askopenfilename()
也就是说在3.……
[/Quote]
你把python3标准库打开看看吧, tkinter本质上就是个目录, 初始化模块根本没导入过啥filedialog,
能直接访问就见鬼了.
I_NBFA 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 syunqiang 的回复:]
如果没有导入界面是显示不出来的,我在IDLE中Run Model可以运行,没有问题,如果没有导入模块在Run Modul的时候也会出问题的。 但是直接双击脚本文件,界面打开,但是单击任何一个按钮都会退出,说明不是导入模块的问题。谢谢楼上。我的问题自己已经搞定了,用2.x比较稳定没有问题。
[/Quote]
没import导致AttributeError当然挂了, 只不过错误信息你没看到. 你把后缀改成py再运行瞧瞧?
你这程序就算import了还是有问题, 双击还是得挂.

ps. idle我不清楚, 但一切以独立运行为主, 总不能release时还开着个idle啥的.
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
有兴趣的朋友可以看看我的博客:
http://blog.csdn.net/syunqiang/archive/2010/08/27/5843962.aspx
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
2.x中的tkFileDialog模块是需要导入的,也就是所需要:
import Tkinter
import tkFileDialog
然后调用tkFileDialog.askopenfilename()

在3.x版本中,直接导入tkinter就可以:
import tkinter
然后就有tkinter.filedialog.askopenfilename()
也就是说在3.x中没有tkFileDialog这个模块了。

3楼的可以试试,再次谢谢你。
syunqiang 2010-08-27
  • 打赏
  • 举报
回复
如果没有导入界面是显示不出来的,我在IDLE中Run Model可以运行,没有问题,如果没有导入模块在Run Modul的时候也会出问题的。 但是直接双击脚本文件,界面打开,但是单击任何一个按钮都会退出,说明不是导入模块的问题。谢谢楼上。我的问题自己已经搞定了,用2.x比较稳定没有问题。
syunqiang 2010-08-26
  • 打赏
  • 举报
回复
哦,对不起,忘记说了,我用的是Python3.1

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧