【问题标题】:tkinter issue on Python3: happens on Mac OS X, not on Windows 10Python3 上的 tkinter 问题:发生在 Mac OS X 上,而不是 Windows 10
【发布时间】:2020-04-20 21:18:43
【问题描述】:

正如标题所说,两台计算机上的代码相同,Python 3 版本相同,一台运行 Mac OSX,另一台运行 Win10。

我完全不知道为什么会发生这种情况,我非常感谢对这里发生的事情的一些解释。我对 python 编码并不陌生,但我对 tkinter 和 GUI 设计(大部分)缺乏经验。

PS.:它在 Windows 10 上运行良好(即输出我想要的),但它不会在 Mac OSX 上运行(即,在 GUI 上点击“运行”按钮显然什么也没做;缺少输入文本框?)。

谢谢!

这是我在 Win 10 上得到的结果

这是我在 Mac OSX 上得到的

这是我的代码:

import tkinter as tk
import math as m
from tkinter import *

root= tk.Tk()
root.title('Cloze Generator')


frame = Frame(root)
frame.pack()

freq = Label(frame, text='Convert every how many words:')
freq.pack( side = LEFT )
#canvas.create_window(50, 100, window=freq)

fr = StringVar()
entry1 = Entry(frame, textvariable=fr)
entry1.pack( side = RIGHT)

canvas = tk.Canvas(root, width = 800, height = 700)
canvas.pack()

entry = tk.Text(root, height=15, width=90) 
canvas.create_window(400, 200, window=entry)

def cloze ():  
    x1 = entry.get('1.0','end')
    originalText = x1

    text = originalText.split()
    code = '{1:SHORTANSWER:='
    newText = ''
    i = 0
    fr = int(entry1.get())

    for word in text:
        i += 1
        if i % fr == 0:
            if word[-1] == '.':
                wordDot = word[:-1] 
                if len(wordDot) > 1: 
                    newWord = wordDot[:m.floor(len(word)/2)]
                    answer = wordDot[m.floor(len(word)/2):]
                    outWord = newWord + code + answer + '}'
                    newText += outWord + '. '
                else:
                    newText += word + '. '
            elif word[-1] == ',':
                wordDot = word[:-1] 
                if len(wordDot) > 1: 
                    newWord = wordDot[:m.floor(len(word)/2)]
                    answer = wordDot[m.floor(len(word)/2):]
                    outWord = newWord + code + answer + '}'
                    newText += outWord + ', '
                else:
                    newText += word + ', '        
            else:
                if len(word) > 1: 
                    newWord = word[:m.floor(len(word)/2)]
                    answer = word[m.floor(len(word)/2):]
                    outWord = newWord + code + answer + '}'
                    newText += outWord + ' '
                else:
                    newText += word + ' '
        else:
            newText += word + ' '

    outText = tk.Text(root, height=15, width=90)
    outText.insert(tk.END, newText)
    canvas.create_window(400, 500, window=outText)

button = tk.Button(text='Run', command=cloze)
canvas.create_window(50, 350, window=button)


root.mainloop()

【问题讨论】:

  • .create_window:为什么要创建一个新窗口而不是使用现有窗口?
  • 如果问题出在文本小部件的外观上,我们不需要 cloze 函数中的所有代码就本问题而言,我们是否需要?
  • 我添加了整个代码,因为它很短,所以人们可以运行它并理解我为什么做某些事情,比如创建一个新窗口,也因为我不知道 tkinter 在哪里生成奇怪的行为。有一个画布,画布上有四个窗口。一个窗口是输入(数字),秒是输入(文本),一个是按钮,一个是输出(只有在有输出时才显示)。
  • “我不知道 tkinter 在哪里产生了奇怪的行为。” - 这就是我们要求您创建 minimal reproducible example 的原因。这样做可以帮助您了解哪些代码产生了奇怪的行为。这就是您解决此类编程问题的方法。

标签: python macos tkinter


【解决方案1】:

文本小部件没有丢失。它在那里,但它没有边框,并且它的背景与其父背景相同,因此它与背景融为一体。

不同的平台对小部件有不同的默认值。在 OSX 上,文本小部件的默认浮雕是“flat”,边框宽度为 0,而在 Windows 上,它是“sunken”和 1。

要查看小部件,如果您希望它在两个平台上看起来相同,您可以显式设置边框宽度和浮雕:

entry = tk.Text(root, height=15, width=90, bd=1, relief="sunken")

PS.:它在 Windows 10 上运行良好(即输出我想要的),但它不会在 Mac OSX 上运行(即,在 GUI 上点击“运行”按钮显然什么也没做;缺少输入文本框?)。

我无法复制这种行为。当我在输入小部件中插入文本并输入数字后单击运行按钮时,该功能似乎可以工作。

【讨论】:

  • 不会使用带有标准主题之一的ttk 小部件在不同平台上提供相同的外观吗? (我没有可以测试的 mac 或 windows 机器,否则我会尝试的。)
  • 最奇怪的是,在第一次(少数)运行时,它确实在 Mac OS X 上显示了寄宿生。第二天,不再。
  • @Gustav:这根本不可能,除非你升级了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多