Я пишу программу для создания черновиков писем и пытаюсь настроить ее с помощью графического интерфейса tkinter. Я на Python 3.5 с tkinter 8.6.
Моя проблема в том, что я не могу заставить работать rowspan. Я хочу, чтобы первая строка занимала несколько строк, но когда я добавляю rowspan, строка не меняет размер. Если я добавлю «sticky = tK.N + tK.S», я получу ошибки, которые ничего не значат. Итак, я начал возиться с тем, как я импортировал tkinter, пробовал его как импорт из, импорт как tk, импорт *, но все, что я меняю, ломает что-то еще, и все еще не получает липкость север-юг, которую я ищу, поэтому что ряд растянется и заполнит пространство.
Я почти уверен, что это проблема, связанная с тем, как я импортирую tkinter, и любые советы будут очень признательны. Я также не могу заставить tkinter работать, если я использую 'import tkinter as tk ", потому что тогда я получаю ошибки, например, имя' StringVar 'не определено". Я попытался исправить это, переместив туда, где был объявлен мой корень, но это создало проблемы с графическим интерфейсом.
Помощь! Спасибо :)
import os
# pull in GUI stuff
import tkinter as tk #import Tk, Label, Button, W, E, N, S, StringVar, OptionMenu, Entry, Text, END, WORD
from PIL import Image, ImageTk
path = os.getcwd()
# init GUI
class GUI:
def __init__(self, master):
self.master = master
master.title("Email Draft Builder")
# set logo image
f = os.getcwd() + "\\cgs_logo.gif"
# lock in image for use outside this section
im = Image.open(f)
ph = ImageTk.PhotoImage(im)
# vars to show dynamic text for displays 1 and 2
self.box1_titleText = tk.StringVar()
self.box2_titleText = tk.StringVar()
self.box1_content = tk.StringVar()
self.box2_content = tk.StringVar()
# main/container pane info
self.label = tk.Label(master, text = "Email Draft Composer", image = ph, bg = "#ffffff")
self.label.image = ph
self.label.grid(columnspan = 3, row = 0, rowspan = 2, sticky=tk.N+
tk.S, column=1)
# ROW 1
self.readLast_button = tk.Button(master, text = "Read Training File", command=self.dataOps)
self.readLast_button.grid(row=3, column=0,sticky=tk.W)
# ROW 2
self.file_button = tk.Button(master, text = "Unused", command=self.chooseSite)
self.file_button.grid(row=4, column=0,sticky=tk.W)
# ROW 3
self.pullSite_button = tk.Button(master, text = "Show Site Info:", command=self.pullSite)
self.pullSite_button.grid(row=5, column=0,sticky=tk.W)
self.getSite = tk.Entry(master)
self.getSite.grid(row=5, column=1,sticky=tk.W)
# ROW 4
self.sendEmail_button = tk.Button(master, text = "Build Email", command=self.sendEmail)
self.sendEmail_button.grid(row=6, column=0,sticky=tk.W)
recipients = ["[email protected]","[email protected]","[email protected];[email protected]","[email protected]"]
self.receiver = tk.StringVar()
self.receiver.set(recipients[0])
self.menu1 = tk.OptionMenu(master, self.receiver, *recipients)
self.menu1.grid(row=6, column=1,sticky=tk.W)
# ROW 5
self.close_button = tk.Button(master, text = "Close", command=root.destroy)
self.close_button.grid(row=7, column=0,sticky=tk.W)
# ROW 6
self.box1_title = tk.Label(master, textvariable=self.box1_titleText, bg = "#fffff0", borderwidth=1, relief = "groove", width = 15)
self.box1_title.grid(columnspan=1, row = 8, column=0, sticky=tk.W)
self.box1_pane = tk.Label(master, textvariable=self.box1_content, bg = "#fffff0", borderwidth=1, relief = "groove", width = 55)
self.box1_pane.grid(columnspan=1, row = 8, column=1, sticky=tk.W)
# ROW 7
self.box2_title = tk.Label(master, textvariable=self.box2_titleText, bg = "#ffff00", borderwidth=1, relief = "groove", width = 15)
self.box2_title.grid(columnspan=1, row = 9, column=0, sticky='nw')
self.box2_pane = tk.Label(master, textvariable=self.box2_content, bg = "#ffffff", borderwidth=1, relief = "groove", width = 55)
self.box2_pane.grid(columnspan=1, row = 9, column=1, sticky='NW')
# ROW 8
self.display1 = tk.Text(master, wrap=tk.WORD)
self.display1.grid(columnspan=1, row = 10, column=1, sticky=tk.W)
def dataOps(self):
return(1)
def chooseSite(self):
return(1)
def pullSite(self):
return(1)
def sendEmail(self):
return(1)
root = tk.Tk()
root.geometry('800x800')
root["bg"] = "#ffffff"
my_gui = GUI(root)
root.mainloop()
Также, если вы используете sticky =, то синтаксис липкий = (tk.N, tk.S) Я считаю
Вы опубликовали целую кучу кода, который, кажется, не имеет отношения к проблеме. Пожалуйста, попробуйте сжать код до минимальный воспроизводимый пример, разработанного специально для этого вопроса.
@Ben, используя это, я получаю «SyntaxError: позиционный аргумент следует за аргументом ключевого слова». Я читал в другом месте, что использование sticky to stretch to fill должно быть «+».
Отредактировал код.
@jasonharper, спасибо! Исправил импорт. Не знаю, почему на меня бомбит "import *", но я бы предпочел добавить т.к. ко всему, чем не заставить это работать. Как не влияет на это наличие виджета в строке? У меня есть метка в этой строке: self.label.






Если вы выполняете
import tkinter as tk, вам нужно добавить префикс каждого объекта Tkinter с помощьюtk.:tk.StringVar(),tk.Button()и т. д. Что касается вашего основного вопроса,rowspan=не имеет видимого эффекта, если в охватываемых строках нет других виджетов.