【问题标题】:Python for loop doesn't work right when it is inside of the command of a buttonPython for 循环在按钮命令内部时无法正常工作
【发布时间】:2014-02-03 21:48:56
【问题描述】:
from Tkinter import *
import tkFileDialog
import sys

def openwindows():
    eText.set(open.show())
def loadfiles():
    filedirectory=eText.get()
    f=file(filedirectory)
    lines = f.readlines()
    length=len(lines)
    #vertex=[]
    #face=[]
    for x in range(0,length):
        print (x)




Root=Tk()
RTitle=Root.title("Assignment_2")
RWidth=Root.winfo_screenwidth()
RHeight=Root.winfo_screenheight()
Root.geometry("%dx%d+%d+%d" % (RWidth/3,RHeight/3*2,RWidth/2-RWidth/6, RHeight/2-RHeight/3))

frame1 = Frame(Root)
frame1.pack()

Label(frame1, text="Filename: ").pack(side = LEFT)

eText = StringVar()
statusbar = Entry(frame1, state="readonly", textvariable=eText)
eText.set("pyramid.txt")
statusbar.pack(side = LEFT)

myfiletypes = [('text files', '*.txt'), ('All files', '*')]
open = tkFileDialog.Open(frame1, filetypes = myfiletypes)
Button(frame1, text="Browse", fg = "Blue", command=openwindows).pack(side = LEFT)
Button(frame1, text = "Load", fg = "red", command=loadfiles).pack(side=LEFT)

frame2 = Frame(Root)
frame2.pack()

Label(frame2, text="Rotation Axis: ").pack(side=LEFT)
r1 = IntVar()
r1.set(3)
Radiobutton(frame2, text="X", variable=r1, value=1).pack(side=LEFT)
Radiobutton(frame2, text="Y", variable=r1, value=2).pack(side=LEFT)
Radiobutton(frame2, text="Z", variable=r1, value=3).pack(side=LEFT)
Radiobutton(frame2, text="Line AB", variable=r1, value=4).pack(side=LEFT)

Label(frame2, text="A:").pack(side=LEFT)
pointA = Entry(frame2, width=10)
pointA.insert(0, "[0.0,0.0,0.0]")
pointA.pack(side=LEFT)

Label(frame2, text="B:").pack(side=LEFT)
pointB = Entry(frame2, width=10)
pointB.insert(0, "[1.0,1.0,1.0]")
pointB.pack(side=LEFT)

var1 = StringVar(Root)
var1.set("90")
Label(frame2, text="Degree:").pack(side=LEFT)
Spinbox(frame2, width=3, from_=0, to=350, increment=10, textvariable=var1).pack(side=LEFT)

var2 = StringVar(Root)
var2.set("5")
Label(frame2, text="Steps:").pack(side=LEFT)
Spinbox(frame2, width=3, from_= 1, to = 10, textvariable=var2).pack(side=LEFT)

Button(frame2, text = "Rotate", fg = "Blue").pack(side=LEFT)

frame3 = Frame(Root)
frame3.pack()

Label(frame3, text="Scale Ratio: ").pack(side=LEFT)
r2 = IntVar()
r2.set(1)
Radiobutton(frame3, text="All", variable=r2, value=1).pack(side=LEFT)
var3 = StringVar(Root)
var3.set("1")
Spinbox(frame3, width=4, from_= 0.25, to = 4, textvariable=var3, increment=0.25, format='%3.2f').pack(side=LEFT)
Radiobutton(frame3, text="[Sx,Sy,Sz]", variable=r2, value=2).pack(side=LEFT)
scaleamount = Entry(frame3, width=10)
scaleamount.insert(0, "[1,1,1]")
scaleamount.pack(side=LEFT)
var4 = StringVar(Root)
var4.set("4")
Label(frame3, text="Steps:").pack(side=LEFT)
Spinbox(frame3, width=3, from_= 1, to = 10, textvariable=var4).pack(side=LEFT)

Button(frame3, text = "Scale", fg = "Blue").pack(side=LEFT)

separator = Frame(height=2, bd=1, relief=SUNKEN)
separator.pack(fill=X, padx=5, pady=5)

Canvas(Root, bg="Blue").pack(fill="both", expand=True)




mainloop()

当你点击加载时,它假设读取文件并显示这个。

0
1
2
3
4
5
6
7
.....

无论你在 txt 文件中有多少行。 但问题是,它只显示这个

0

这意味着 for 循环只运行了一次,仅此而已。 如果我关闭程序,那么其余的数字将显示在命令提示符中。 真的很奇怪……没有意义。 loadfiles() 本身工作得很好。 它只是不适用于按钮

【问题讨论】:

  • 如果你只运行那个函数会发生什么?打印 lines 以查看它是否读取了文件。
  • @sashkello 我试过了。
  • 显示print lines的结果。
  • @sashkello ['v 0 0 0\n', 'v .8 0 0\n', 'v 0 .8 0\n', 'v .8 .8 0\n' , 'v 0.4 0.4 .7\n', 'f 4 2 1\n', 'f 3 4 1\n', 'f 2 5 1\n', 'f 5 3 1\n', 'f 2 4 5\n', 'f 3 5 4\n', 'w -1.0 -1.0 1\t1\n', 's 0.1 0.1 0.9 0.9\n', '\n']
  • @sashkello 类似这个函数只运行1个打印语句,如果我在for loop前面添加print lines,则只会打印lines0将是消失了

标签: python-2.7 button for-loop tkinter


【解决方案1】:

问题与 UI 的处理方式有关。

尝试将print (x) 替换为

sys.stdout.write(str(x) + '\n')  # or "{}\n".format(x)
sys.stdout.flush()

如果您搜索 tkinter 和 flush,您会发现很多对话可供阅读。

【讨论】:

  • 我发现了问题,如果我将其作为可执行文件打开,我的所有代码都可以正常工作。如果我尝试在 Wing IDE 中运行它,它的行为是这样的。
  • 在我的 OSX 机器上运行您的代码时,我看到了您描述的行为。当我做出上面建议的更改时,我看到 '0\n\1\n2\n0'。
  • for x in range(0,length): sys.stdout.write(str(x) + '\n') # or "{}\n".format(x) sys.stdout.flush()
  • 真的,您应该读取数据并将其放入小部件中,而不是使用标准输出大惊小怪。更大的问题是您将阻塞 UI,直到文件 I/O 和文本输出都完成。你真的应该有一个空闲的处理器或线程。
猜你喜欢
  • 2020-07-09
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多