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

我正在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} {
    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}]
的缩写。