TCL登录程序不支持';行不通
我正在TCL做一个登录程序。我有以下代码:TCL登录程序不支持';行不通,tcl,tk,Tcl,Tk,我正在TCL做一个登录程序。我有以下代码: package require Tk set usr [open "$env(HOME)\\AppData\\Roaming\\basicfile\\USR.txt" r] set pwd [open "$env(HOME)\\AppData\\Roaming\\basicfile\\PWD.txt" r] set numtries [expr 3.0] proc log {} { if {$::numtries > 0.0} { i
package require Tk
set usr [open "$env(HOME)\\AppData\\Roaming\\basicfile\\USR.txt" r]
set pwd [open "$env(HOME)\\AppData\\Roaming\\basicfile\\PWD.txt" r]
set numtries [expr 3.0]
proc log {} {
if {$::numtries > 0.0} {
if {[.e get] == [read $::usr]} {
if {[.e1 get] == [read $::pwd]} {
close $::usr
close $::pwd
pack forget .l
pack forget .e
pack forget .l1
pack forget .e1
pack forget .b
.l configure -text "Login Successful!"
pack .l
} else {
set ::numtries [expr $::numtries - 1.0]
if {$::numtries <= 0.0} {
.b configure -state disabled
}
}
} else {
set ::numtries [expr $::numtries - 1.0]
if {$::numtries <= 0.0} {
.b configure -state disabled
}
}
} else {
.b configure -state disabled
}
if {$::numtries <= 0.0} {
.b configure -state disabled
}
}
ttk::label .l -text "Enter your name:"
ttk::entry .e
ttk::label .l1 -text "Enter your password:"
ttk::entry .e1 -show "*"
ttk::button .b -text "Login" -command log
pack .l
pack .e
pack .l1
pack .e1
pack .b
包需要Tk
设置usr[打开“$env(HOME)\\AppData\\Roaming\\basicfile\\usr.txt”r]
设置pwd[打开“$env(HOME)\\AppData\\Roaming\\basicfile\\pwd.txt”r]
设置数值[expr 3.0]
进程日志{}{
如果{$::numtries>0.0}{
如果{[e get]==[read$::usr]}{
如果{[.e1 get]==[read$::pwd]}{
关闭$::usr
关闭$::pwd
别忘了,我
打包忘记
打包忘记
打包忘记
打包忘记
.l配置-文本“登录成功!”
包
}否则{
set::numtries[expr$::numtries-1.0]
如果{$::numtries,您的程序似乎不完整。无论如何,请尝试以下操作(更新usr.txt和pwd.txt的路径):
包需要Tk
设置usr[打开“usr.txt”r]
设置pwd[打开“pwd.txt”r]
设置numtries 3
进程日志{}{
放入“尝试#$::numtries”
如果{$::numtries,您的程序似乎不完整。无论如何,请尝试以下操作(更新usr.txt和pwd.txt的路径):
包需要Tk
设置usr[打开“usr.txt”r]
设置pwd[打开“pwd.txt”r]
设置numtries 3
进程日志{}{
放入“尝试#$::numtries”
如果{$::numtries问题可能是这样的。read
命令一次读取整个文件,因此下次从文件中读取时会得到空字符串。如果名称和密码字段为空,则它们将等于从文件中读取的空字符串,登录将成功
这样的事情应该行得通:
set dir $env(HOME)/AppData/Roaming/basicfile
set uf [open [file join $dir USR.txt]]
set pf [open [file join $dir PWD.txt]]
set usr [read -nonewline $uf]
set pwd [read -nonewline $pf]
close $uf
close $pf
set numtries 3
ttk::label .nl -text "Enter your name:"
ttk::entry .ne
ttk::label .pl -text "Enter your password:"
ttk::entry .pe -show "*"
ttk::button .b -text "Login" -command log
pack {*}[winfo children .]
proc log {} {
global numtries usr pwd
if {[incr numtries -1] > 0} {
if {([.ne get] eq $usr) && ([.pe get] eq $pwd)} {
destroy {*}[winfo children .]
ttk::label .l -text "Login successful"
pack .l
} else {
.ne delete 0 end
.pe delete 0 end
}
} else {
destroy {*}[winfo children .]
ttk::label .l -text "Too many tries"
pack .l
}
}
如果您有一个旧的、过时的Tcl版本,pack{*}[winfo children.]
和eq
操作符将不起作用:尝试eval pack[winfo children.]
(与destroy
类似)和=
。或者更好的是升级
文档:,,,,,,问题可能是这样的。read
命令一次读取整个文件,因此下次从文件中读取时会得到空字符串。如果名称和密码字段为空,则它们将等于从文件中读取的空字符串,登录将成功
这样的事情应该行得通:
set dir $env(HOME)/AppData/Roaming/basicfile
set uf [open [file join $dir USR.txt]]
set pf [open [file join $dir PWD.txt]]
set usr [read -nonewline $uf]
set pwd [read -nonewline $pf]
close $uf
close $pf
set numtries 3
ttk::label .nl -text "Enter your name:"
ttk::entry .ne
ttk::label .pl -text "Enter your password:"
ttk::entry .pe -show "*"
ttk::button .b -text "Login" -command log
pack {*}[winfo children .]
proc log {} {
global numtries usr pwd
if {[incr numtries -1] > 0} {
if {([.ne get] eq $usr) && ([.pe get] eq $pwd)} {
destroy {*}[winfo children .]
ttk::label .l -text "Login successful"
pack .l
} else {
.ne delete 0 end
.pe delete 0 end
}
} else {
destroy {*}[winfo children .]
ttk::label .l -text "Too many tries"
pack .l
}
}
如果您有一个旧的、过时的Tcl版本,pack{*}[winfo children.]
和eq
操作符将不起作用:尝试eval pack[winfo children.]
(与destroy
类似)和=
。或者更好的是升级
文档:,,,,,,我无法更新路径,因为文件位于不同的目录中,但我将尝试此操作。谢谢!我的意思是更新此代码并将路径设置指向文件所在的位置。设置usr[打开“$env(主页)\\AppData\\Roaming\\basicfile\\USR.txt“r]设置pwd[打开“$env(HOME)\\AppData\\Roaming\\basicfile\\pwd.txt”r]我无法更新路径,因为文件位于不同的目录中,但我将尝试此操作。谢谢!我的意思是更新此代码并使路径设置指向文件所在的位置。设置usr[打开“$env(HOME)\\AppData\\Roaming\\basicfile\\usr.txt”r]设置pwd[open“$env(HOME)\\AppData\\Roaming\\basicfile\\pwd.txt”r]谢谢,它起作用了,但我得看看它是如何工作的。这个部分是什么
do?我从来没有遇到过这个命令,我也不太理解wiki.tcl.tk中的文档。@Ranger:更新了指向真实手册页的链接(wiki页并不总是足够)。简而言之,incr
取一个变量名并递增该变量。递增-1意味着该变量将递减1。它(或多或少)是set numtries[expr{$numtries-1}]
的缩写。谢谢,它工作了,但我必须看看它是如何工作的。该部分是什么
do?我从来没有遇到过这个命令,我也不太理解wiki.tcl.tk中的文档。@Ranger:更新了指向真实手册页的链接(wiki页并不总是足够)。简而言之,incr
接受一个变量名并递增该变量。递增-1意味着该变量将递减1。它(或多或少)是set numtries[expr{$numtries-1}]
的缩写。